簡體   English   中英

類的構造方法,其上級只能通過工廠方法制成

[英]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是,不是讓barfoo繼承而來,而是包含foo的實例作為成員。 在構造函數中,您可以為foo調用factory方法。

您走哪條路可能取決於細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM