你不會錯過任何東西。你做什麼完全取決於你的情況。但是,請考慮:
在setter中進行參數驗證非常普遍。例如,假設我有一個領域中的類,它可以通過10容納值0(以下簡稱「投」是不必要的異常以下類型,但我有它的清晰度):
public class Example {
private int value;
public Example() {
}
public final int getValue() {
return value;
}
public final void setValue (int value) throws IllegalArgumentException {
if (value < 0 || value > 10)
throw new IllegalArgumentException("Value is out of range.");
}
}
這裏的setValue( )驗證'價值',以確保它堅持規則。我們有一個不變量,指出「範例不會超出範圍值」。現在讓我們假設我們想要構造一個具有價值的構造函數。你可能會這樣做:
public class Example {
...
public Example (int value) {
this.value = value;
}
...
}
正如你所看到的,有一個問題。新示例(11)的聲明會成功,現在存在一個違反我們規則的示例。然而,如果我們使用二傳手在構造函數中,我們可以很方便的所有參數驗證添加到構造以及:
public class Example {
...
public Example (int value) throws IllegalArgumentException {
setValue(value); // throws if out of range
}
...
}
所以有這許多好處。
現在,仍然有些情況下您可能希望直接分配值。首先,也許你沒有setter可用(儘管我會爭辯說,創建私有或包私有setter仍然是可取的,由於上述原因,如果必要反射/ bean支持,併爲了便於在更復雜的代碼驗證)。
另一個原因可能是,您可能有一個構造函數,它知道,在某種程度上,會提前分配有效值,因此不需要驗證,並且可以直接分配變量。這通常不是跳過使用setter的有力理由。但是,總而言之,儘可能在所有地方使用setter通常是一個好主意,它通常會導致更清晰和更清晰的代碼,隨着複雜性的增加,這些代碼更容易維護。
大多數人看到人們直接設置變量的例子就是人們「懶惰」 - 如果情況允許,這是完全可以接受的(也許你正在編寫一個快速測試程序或應用程序,並且不想例如,執行一系列setter)。只要你牢記大局,在適當的時候只是「懶惰」,沒有什麼不對的。
我想根據這裏的其他答案添加一些東西:如果您在子類中重寫setter,並且您設置的數據會中斷基類所假定的不變量,那麼相關的setters應該是作出最終決定或基礎階級不應做出這些假設。 如果壓倒性的setter違反了基類不變量,那麼手頭就有更大的問題。
你會注意到getter/setter在上面的例子中是final的。這是因爲我們的規則是「任何示例必須具有從0到10的值」。因此該規則延伸至子類。如果我們沒有這個規則,並且一個例子可以採用任何值,那麼我們不需要最終的setter,並且可以允許子類覆蓋。
希望有所幫助。
我相信使變量變爲私有的目的是將它們從**其他**類的直接操作中分離出來。 –
另外,'this'關鍵字不是getter所必需的;它只在含糊不清的情況下使用(例如,如果在同一範圍內有另一個名爲「name」的變量) – ataulm