2011-02-09 67 views
1

我正在使用C++和C#開發一段時間後的Java項目,並且對構造函數中字段初始化的最佳做法有疑問。基本上,假設我有一個簡單的Point類。在C++中構造我的字段初始化會是什麼樣子:類構造函數中的字段初始化:直接或通過「setter」?

class Point { 
public: 
    // Default constructor 
    Point(double x, double y) : x(x), y(Y) { } 

protected: 
    // Coordinates 
    double x, y; 
}; 

在C#...

class Point { 
    // Coordinates, with automatic properties 
    public double X { get; protected set; } 
    public double Y { get; protected set; } 

    // Default constructor 
    Point(double x, double y) { 
     X = x; 
     Y = y; 
    }  
} 

在Java ...最佳實踐建議來定義的getter/setter方法必須是場從外面訪問。但是最好從課堂內部使用它們?這個疑問來自於Eclipse看起來很舒服,即將類代碼中的每個this.field = field轉換爲setField(field)以獲得具有getter/setter的字段,即使我在類代碼中發生讀/寫操作(因此我不需要使用類接口)。

這基本上爲每個訪問添加一個函數調用。現在,除了設置字段涉及其他一些操作(即驗證,處理等)的情況是否有這種意義?常識意味着使用getters/setters類似於使用C#屬性,但在這裏我特別關注C#的自動屬性,它只涉及基本訪問權限,不進行任何處理。所以問題是:在類代碼中沒有額外處理的情況下調用getter/setter是否有好處?

謝謝
Tunnuz

回答

4

吸氣劑二傳手封裝的事。今天沒有什麼可以處理的,但明天你可能需要處理一些事情。所以最好使用Getters Setters。

對於默認值啓動,您可以使用構造函數。\但如果在設置獲取使用Getters Setters時有一些處理。

最佳做法是使用

  • 構造/ Initilizer塊,用來初始化成員字段到其值。
  • 從外部類使用吸氣劑直接
  • 類訪問字段內/ setter方法

另請參見

+0

這就是要點。 +1以獲得更清晰的答案。 – 2011-02-09 11:02:05

0

作爲I」已經被教導,在構造函數中使用getter和setter是不必要的,只會創建額外的方法調用來減慢你的程序。我不確定這是多麼重要,因爲這種方法調用通常在編譯時內聯。

2

我還喜歡直接訪問。但是,對於非平凡的get/setter,如果內部也需要非平凡的語義,您可能希望使用它們。

如果事先不知道get/setters是否是非trival,那麼你也可能事先不知道內部是否應該執行額外的工作,所以過早封裝不是儘可能有用。

我的Eclipse(Helios)安裝不會執行此轉換,因此我假設您可以關閉它。

1

如果您要對要設置的值進行驗證,格式化或處理,可以推薦使用setter。

讓我們假設你需要你的類Foo總是需要有一個不爲空欄值,而不是使用設置方法時,你需要每次都重寫驗證碼,你設置的值:

public class Foo { 

    private String bar; 

    public Foo(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Duh"); 
     } 

     bar=aValue; 

    } 

    public void setBar(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Duh"); 
     } 

     bar=aValue; 

    } 
} 

使用setter,您可以重用代碼,並允許在一點內實現更多邏輯:

public class Foo { 

    private String bar; 

    public Foo(String aValue) { 

     setBar(aValue); 

    } 

    public void setBar(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Empty values not allowed"); 
     } 

     if(aValue.length()>24) { 
      throw new IllegalArgumentException("Too long"); 
     } 
     bar=aValue; 

    } 

} 
相關問題