[英]Multiple optional arguments in constructor in Java - exponential number of constructors
這是我遇到過幾次,但還沒有找到令人滿意的答案。 這看起來很愚蠢,但谷歌搜索了一段時間后,我無法想出一些好的東西。
假設我有一個包含20個實例變量的類,每個變量都是可選的(將被初始化或不被初始化)。
現在我希望我的構造函數處理所有的情況,如果有一些實例變量它很好,我可以創建具有不同簽名的構造函數,但是這里我有20個,所以我需要2 ^ 20 = 1,048,576個構造函數處理所有案件! 這似乎......不是最優,你不同意嗎?
所以,由於采用這種強力方法,我基本上必須構造2 ^ n個構造函數,其中n是實例變量的數量,我想找到更好的方法來實現它。
我已經看到了這個問題的幾個解決方案,但我相信它們都是關於數據的假設,但在我的情況下,這些變量中的每一個都可以初始化或不是隨機的,我在初始化之前無法知道。
我正在尋找一些我可以應用的設計模式或想法,以使我的代碼更加可維護(不用擔心我沒有創建1M +構造函數:)
謝謝。
將Bean模式與Builder結合使用。 YourObject在構造過程中不會有不一致的狀態,但它仍然需要20多個set操作,你可以使YourObject不可變(如果你想) - 但不是YourObjectBuilder。
public class YourObject {
private Type field1;
private Type field2;
private Type field3;
...
YourObject ( Type field1 , Type field2 , Type field3 ... ) { }
}
public class YourObjectBuilder {
private Type field1;
private Type field2;
private Type field3;
...
public YourObjectBuilder() {
}
public YourObject make ( ) {
return new YourObject ( field1 , field2 , field3 ... ) ;
}
public void setField1(Type t) {
field1 = t;
}
public void setField2(Type t) {
field2 = t;
}
public void setField3(Type t) {
field3 = t;
}
...
}
public class YourObject {
private Type field1;
private Type field2;
private Type field3;
...
public YourObject() {
}
public void setField1(Type t) {
field1 = t;
}
public void setField2(Type t) {
field2 = t;
}
public void setField3(Type t) {
field3 = t;
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.