所以當我編寫自己的項目時,初始化一個對象時出現了一個問題。我的班級有很多屬性需要啓動,但並不總是全部都是這樣。這時候,我想出了這個主意(但我不知道這是否是之前的任何地方使用):建議這種初始化方法嗎?
public class MyClass {
public static final int DEFAULT1 = 1;
public static final int DEFAULT2 = 2;
public static final int DEFAULT3 = 3;
private int attr1;
private int attr2;
private int attr3;
private MyClass(){
attr1 = DEFAULT1;
attr2 = DEFAULT2;
attr3 = DEFAULT3;
}
public static MyClass create(){
return new MyClass();
}
public MyClass setAttr1(int attr1){
this.attr1 = attr1;
return this;
}
public MyClass setAttr2(int attr2){
this.attr2 = attr2;
return this;
}
public MyClass setAttr3(int attr3){
this.attr3 = attr3;
return this;
}
}
當我創建一個新的MyClass
比如我會做:
MyClass obj = MyClass.create().setAttr1(3).setAttr3(1);
它工作了我(有些是因爲我測試過,但我還沒有決定在我的項目中使用它)。我的問題是,這是合法的嗎?它會產生任何種類的內存/執行問題嗎?
使用製造商的設計模式,如果你有一些可選的屬性更多https://www.tutorialspoint.com/design_pattern/builder_pattern.htm,這是創建對象的推薦方式,它特別適合您的情況。 –
哦,對,謝謝你指出。我不知道這個哈哈有一個完整的設計模式。 –
這已經非常接近Builder的設計模式了,正如上面的@AmitK所討論的那樣。爲了實現這一目標,將'setAttr *'方法移出到另一個名爲「MyClassBuilder」的類,它們將返回當前的「MyClassBuilder」對象以幫助鏈接。最後,應該有一個實例方法'build',它創建一個MyClass對象,並設置屬性並將其返回(您可能希望將這些類放入一個單獨的包中,併爲您的字段使用包 - 私有(默認)可見性如有必要)。 –