2010-10-10 57 views
1

當我有一個公開的暴露類時,我通常會將其成員變量與公共訪問器和增變器一起私有化(如果可能,我會盡量避免使用增變器來使我的類不可變)。我們是否應該嚴格遵守set/get規則

例如,

public class Point { 
    private final int x; 
    private final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

如果類是私人使用,我通常會

private static class Point { 
    public final int x; 
    public final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

因爲我覺得第二個辦法是我方便多了。雖然一個好的IDE可能會有所幫助,但不那麼繁瑣且輸入少。

我想知道,如果我有一個公共消費類,我使用第二種方法是否好? (通過確保我公開的字段將是不可改變的)。

它的任何缺點?雖然它似乎違反了OOP封裝理論,但從實際角度來看,我並沒有看到真正的危害。

回答

5

如果它是一個私人類,只有父類將使用,我通常會放在字段而不是getter和setter。如果不會被其他第一方或第三方類使用,那麼添加驗證就毫無意義。

基本上,你的類需要相信自己,並且包括嵌套類。

但是,如果它是一個公共類,它將被第一或第三方使用,那麼您絕對不應公開這些公共字段。如果您需要爲屬性添加驗證,那麼它將成爲一個重大更改,因爲您需要將公共字段更改爲兩個公共方法。如果你正在編寫庫代碼,情況尤其如此。

如果您的示例中的字段爲final,則可能有一個例外。如果它是一個像Point這樣的小類,並且它完全是不可變,那麼我可能會將這些字段公開爲決賽。任何驗證都會在構造函數中發生。只要確保你將來不會添加任何可能破壞該類的東西。

+0

是。我知道這對私人課程是成立的。公共課怎麼樣? – 2010-10-10 17:34:33

+0

@Yan Cheng CHEOK對不起,沒有仔細閱讀你的問題,看看編輯。 – mgbowen 2010-10-10 17:35:03

0

簡單的數據持有者(又名結構在C),可以節省get/setters,恕我直言。一些像SWT或者Swing這樣的現代GUI工具包都具有簡單的結構化像Rectangle或者Point這樣的元素直接訪問的地方,以及這些類是公共API的一部分。哦,並且工具包的類沒有最終的修飾符,因爲通常你只能改變一個值(比如矩形中的x,把它移到右邊)。

其中一個原因是,在原始值不足的情況下,點和反轉通常用於返回值。

因此,我們可以得出結論:一個簡單的規則,其中它的好:當且僅當該類是不可能改變的,因爲它是非常簡單的,如果它的使用非常普遍,這樣的時間增益是衡量,如果bean綁定中沒有使用屬性,那麼當屬性更改時不需要屬性更改事件,那麼可以省略setter和getters。

1

通常遵循由JavaBeans約定給出的訪問器規則是一個好主意,因爲一些最常用的框架/庫使用它來在內部訪問某些字段(例如表達式語言)。

完全有必要嗎?,絕對不是,這是一個約定你可以關注它或忽略它。但是儘可能多的約定,它的目標是有一個統一的方式來做一些事情(這裏訪問屬性)。

如果您認爲這樣的代碼需要太多時間來開發,那麼您可以使用IDE(如您在問題中所述);如果問題是您必須生成的完全不必要的代碼,我建議您查看Lombok Project
不幸的是,現在沒有「好」的解決方案;在the premises of Java 7期間已經看到了用Java訪問屬性的不同方式的想法,但最終它不會成爲未來版本Java語言的一部分。

隨着你的公共API,我真的建議你堅持這個約定。這樣,當開發人員想要使用您提供的任何組件時,他將不需要包裝所有內容,以便通過getter // setter訪問屬性,以使其與他使用的框架一起工作。

最終屬性不會改變任何問題,但此外,你不應該有最終的屬性,因爲你擔心有人可以從外部修改它,但只是因爲你的屬性絕不能改變,你想它是最終的。這就是封裝如此重要的原因。

+0

-1它們不是java工作方式的一部分,它們是某些框架工作方式的一部分。只要你不使用這些框架,沒關係。如果您使用這些框架,則生成所需的獲取者和設置者並不困難。 – 2010-10-10 17:45:32

+0

@Erick Robertson,我更新了答案,Java有點太模糊,我的意思是特別是J2EE(因此我的例子)。 – 2010-10-10 18:08:32

+0

@Colin:問題不在於J2EE。 – 2010-10-10 21:01:06