![](/img/trans.png)
[英]Implicit constructor in case of anonymous class whose super class is an Inner Class
[英]Constructor for a class whose super should only be made via factory method
我有以下課程:
public class Foo(){
int parameter;
static Set<Foo> cache=new HashSet<Foo>();
public Foo(int parameter){
this.parameter=parameter;
addToCache(this);
}
public static Foo Factory(int parameter){
Foo duplicate=findDuplicate(parameter);
if (duplicate!=null){
return duplicate;
}else{
return new Foo(parameter);
}
}
}
注意,直接調用Foo
的構造函數將添加到靜態緩存中。 現在,我需要對該對象進行子類化以添加一些功能。
public class Bar() extends Foo{
public Bar(int parameter){
//Danger
}
}
但是現在我被卡住了。 Bar的構造函數必須以一種或另一種方式調用super()
,但這不會像Foo.Factory()
那樣檢查重復項。
我真正想要的是:
public Bar(int parameter){
this=Foo.Factory(parameter);
}
但這顯然不是有效的java。
現在,我被迫為Foo寫一個hacky的二級構造函數,該構造函數還會檢查重復項,並讓Bar使用它:
//Second unused parameter just so the constructors are different
public Foo(int parameter, boolean isEvil){
Foo duplicate= findDuplicate(parameter);
if (duplicate!=null){
this.copy(duplicate); //Evilly take on all attributes of duplicate
}else{
//Now we have to copy the body of the original constructor.
//It has to be kept synched forever, and I can't even call it!
this.parameter=parameter;
addToCache(this);
}
}
Bar(int parameter){
super(int,true);
}
但這存在始終創建一個新對象的問題,這可能導致可變性和哈希問題。 此外,任何不注意的人都無法說出此構造函數的工作方式不同。
TLDR:我如何為只能通過工廠方法制成其上級的類構造一個構造函數。
這個問題可能重復,但是在Java中(這個問題也只有一個答案,這對我和OP都不滿意)
從我的角度來看,您有兩種選擇。
選項1是為bar
創建工廠方法,而不是公共構造函數。
選項2是,不是讓bar
從foo
繼承而來,而是包含foo
的實例作為成員。 在構造函數中,您可以為foo
調用factory方法。
您走哪條路可能取決於細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.