這個問題並沒有涉及具體的問題,而是一個普遍的問題。在Java中,創建一個類時,其實有兩個選擇如何能夠進入該類的實例變量:如何在Java中設置對象的實例變量?
通過創建一個構造,誰就有參數列表中,將設置的值的實例變量。
通過向設置實例變量的類添加setters(和getters)方法。
所以現在我想知道:哪個選項其實更好呢?我還讀到,創建對象時不保留實例變量不是好方法,建議爲它們設置一些值也是可取的。真的嗎?在這種情況下,我會看到第一個選項是更好的選項。
這個問題並沒有涉及具體的問題,而是一個普遍的問題。在Java中,創建一個類時,其實有兩個選擇如何能夠進入該類的實例變量:如何在Java中設置對象的實例變量?
通過創建一個構造,誰就有參數列表中,將設置的值的實例變量。
通過向設置實例變量的類添加setters(和getters)方法。
所以現在我想知道:哪個選項其實更好呢?我還讀到,創建對象時不保留實例變量不是好方法,建議爲它們設置一些值也是可取的。真的嗎?在這種情況下,我會看到第一個選項是更好的選項。
如果您認爲它們與對象創建有關,請將它們放入構造函數中。例如創建一個正方形,你需要它的大小,但添加一個顏色不是強制性的東西 所以在這種情況下,長度將在構造函數中設置,顏色將通過setter方法設置。
這一切都取決於軟件設計和意圖,是否有一個用例創建一個新的對象,而沒有所有的參數?一些參數? Getters/Setters和其他內部方法都應該在執行任何工作之前檢查輸入/數據 - 這可以確保您在前進之前可能做出的任何假設都會被檢查。
構造函數的純面向對象思想是創建一個處於一致狀態的實例。構造函數的責任是確保不創建不一致的實例。然後,該實例的每個方法都有責任將實例從一致狀態轉移到另一個一致狀態。
因此,我總是建議強制在必須驗證所有輸入參數的構造函數中設置實例變量。
如果某些實例變量允許修改,請提供一個setter。爲了使思考一致,請在構造函數中使用該設置器!爲了防止構造器污染,您至少應該有一個構造函數,該構造函數接受所有您不能提供任何合理的默認值或您不想提供setter的所有必需屬性值,因爲它們的值在構建後是最終的。
對我來說,使用Constructor
方法:
如果你想反對Ready to Use
。
Setters
對象的進一步更改。
除非在施工後有迫切需要更改值,否則我強烈建議在構造函數中設置字段。原因是隻有在構造函數中設置的字段可以被設置爲immutable,並且不變性是一件非常好的事情,因爲它使得類不可能通過反射或任何其他手段被改變。
最終字段的一個例子:
public class MyClass {
private final int id;
public MyClass(int id) {
this.id = id;
}
當字段是一個setter多變,以鎖定類向下的唯一方法是通過任一做檢查如
public void setID(int id) {
if(id != -1) {
throw new IllegalStateException("Already set!");
}
this.id = id;
}
或者以某種方式鎖定整個對象:
public void lock() {
if(getID() == -1) {
throw new IllegalStateException("Must first setID(i).");
}
isLocked = true;
}
public void setID(int id) {
if(isLocked()) {
throw new IllegalStateException("isLocked() is true.");
}
this.id = id;
}
應該很明顯,在c中設置字段onstructor是一個很少複雜。
@MichalB:如果你覺得這個答案對你有幫助,請考慮投票並接受它。謝謝! – aliteralmind
取決於情況?通常,當有多個選項時,沒有一種方法最適合所有情況。 –