2016-04-15 124 views
-2

我剛剛用我的練習教師討論了參數化構造函數。他說有兩個或更多的構造函數,特別是參數化的構造函數是不好的做法。我應該只使用一個空的構造函數和初始化工廠方法模式,而不是構造函數。Java中的參數化構造函數

所以這是第一次,我聽說過這樣的事情。我做了一些研究,但我找不到任何相關的東西。我發現唯一不好的做法是:

  • 內使用內部構造公共/保護方法(因爲一個子類可以覆蓋的方法)
  • 野生計算
構造
  • 參數太多

    所以我的問題是,最佳做法是什麼?在構造函數中設置實例變量是好的,還是應該遵循建議並使用工廠方法模式?

  • +7

    這就像他的意見一樣。 –

    +0

    可以有超過1個構造函數,但如果你不鏈接它們,你可能會得到不一致的結果,例如見[這個問題](http://stackoverflow.com/q/25272784/217324)我會建議你的術語是正確的,你可能是指「實例變量」,而不是「類變量」 –

    +0

    你的意思是構建器模式? –

    回答

    0

    無論您使用的是工廠方法或多個構造是真的只是個人喜好,尤其是與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()。在使用工廠模式時,必須非常小心,以確保其他代碼無法在不經過工廠的情況下直接創建對象。 (上面的類也是很多其他原因不好的,但它們與我試圖創建的點不相關)。

    0

    最佳實踐取決於您,由您決定。 我建議使用Project Lombok(https://projectlombok.org)。 您可以在類@AllArgsConstructor上使用註釋,它會自動創建。你也可以使用@RequiredArgsConstructor作爲final字段。自動創建獲取者和設置者有很多可能性。所以你的代碼會更短,更具可讀性。