我剛剛用我的練習教師討論了參數化構造函數。他說有兩個或更多的構造函數,特別是參數化的構造函數是不好的做法。我應該只使用一個空的構造函數和初始化工廠方法模式,而不是構造函數。Java中的參數化構造函數
所以這是第一次,我聽說過這樣的事情。我做了一些研究,但我找不到任何相關的東西。我發現唯一不好的做法是:
- 內使用內部構造公共/保護方法(因爲一個子類可以覆蓋的方法)
- 野生計算
所以我的問題是,最佳做法是什麼?在構造函數中設置實例變量是好的,還是應該遵循建議並使用工廠方法模式?
我剛剛用我的練習教師討論了參數化構造函數。他說有兩個或更多的構造函數,特別是參數化的構造函數是不好的做法。我應該只使用一個空的構造函數和初始化工廠方法模式,而不是構造函數。Java中的參數化構造函數
所以這是第一次,我聽說過這樣的事情。我做了一些研究,但我找不到任何相關的東西。我發現唯一不好的做法是:
所以我的問題是,最佳做法是什麼?在構造函數中設置實例變量是好的,還是應該遵循建議並使用工廠方法模式?
無論您使用的是工廠方法或多個構造是真的只是個人喜好,尤其是與Java 8,你可以很容易地使用構造函數引用作爲工廠(這是所有構造函數確實是 - 成對象的實例的工廠)。如果一個類有多個構造函數,並且如果在一個類中有太多的構造函數是完全正確的,那麼這個類的標誌是做得太多了,而不是你需要切換到工廠。當一個類需要特定的輸入有效並且null
/0
不是一個理智的默認值時,應該對構造函數進行參數化。
你應該避免什麼,但是,允許對象處於無效狀態存在。例如,請考慮下面的類工廠:
public class MyList {
private Object[] backingArray;
public void setBackingArray(Object[] backingArray) {
this.backingArray = backingArray;
}
}
public class MyListFactory() {
MyList newMyList(int initialSize) {
MyList list = new MyList();
list.setBackingArray(new Object[initialSize]);
return list;
}
MyList newMyList() {
MyList list = new MyList();
list.setBackingArray(new Object[defaultSize]);
return list;
}
}
這是糟糕的設計例子,因爲我可以忽略的工廠和直接調用new MyList()
和對象基本上是無效的,直到我也呼籲setBackingArray()
。在使用工廠模式時,必須非常小心,以確保其他代碼無法在不經過工廠的情況下直接創建對象。 (上面的類也是很多其他原因不好的,但它們與我試圖創建的點不相關)。
最佳實踐取決於您,由您決定。 我建議使用Project Lombok(https://projectlombok.org)。 您可以在類@AllArgsConstructor上使用註釋,它會自動創建。你也可以使用@RequiredArgsConstructor作爲final字段。自動創建獲取者和設置者有很多可能性。所以你的代碼會更短,更具可讀性。
這就像他的意見一樣。 –
可以有超過1個構造函數,但如果你不鏈接它們,你可能會得到不一致的結果,例如見[這個問題](http://stackoverflow.com/q/25272784/217324)我會建議你的術語是正確的,你可能是指「實例變量」,而不是「類變量」 –
你的意思是構建器模式? –