2013-07-15 59 views
6

現在我正在創建一個可以保存我的配置的類的負載,就是這樣。我所做的只是存儲配置文件中的值。最終變量的獲取者

超過一半的代碼是getters,我想知道該練習是否仍然有getters或直接訪問變量。

所以這個:

public myClass 
{ 
    public myClass(String name) 
    { 
     this.name = name; 
    } 

    final String name; 

    public final String getName() 
    { 
     return name; 
    } 
} 

或者:

public myClass 
{ 
    public myClass(String name) 
    { 
     this.name = name; 
    } 

    public final String name; 
} 

看來真的很傻有所有的干將那裏時,他們實際上並沒有做任何事情,只是返回的變量。但是我被告知,無論如何要讓getter在那裏是很常見的Java實踐。

+1

無論如何,編譯器都會內聯它們。儘管我會利用java.util.Properties來處理你正在做的事情。 – jlordo

+2

使用最終變量時,它可能看起來很愚蠢,但如果你有非最終變量和子類具有相同的變量名稱定義,並且你嘗試訪問這些變量,那麼你會看到沒有get/set會有多混淆。正確的封裝始終是最佳實踐。 – kosa

+0

@jlordo這是我給的一個非常簡單的例子。 '屬性'是不適合我在做什麼:) – Cheetah

回答

11

的getter封裝的數據可以提供多種優勢,包括:

  • 您可以現場更改爲其他表示,在不影響呼叫者。
  • 您可以在getter中添加額外的代碼。
  • 您可以實現提供獲取者的接口。
  • 即使不是final,您也可以提供字段的只讀訪問權限。
+1

這樣做的最重要原因是你在答案中解釋的[coupling](http://en.wikipedia.org/wiki/Coupling_%28computer_programming%29)。 –

+0

@LuiggiMendoza你能否進一步解釋關於getters/setters的耦合? –

+2

有更多的代碼耦合到類的表示使得更多的工作來改變這種表示。封裝隱藏了接口後面的內部表示,隨着表示的變化,接口可以保持不變。 –

0

我所知道的做法是,你可以使用公共靜態最終場與不變類型,如System.out例如。但是,我確實將獲得者添加到實例字段

我同意你的意見,但是最後幾乎沒有什麼傷害String。不過,請注意可變類型。此外,由於IDE中有內聯和代碼生成,因此getters的成本往往相當小,無論是編寫代碼還是運行時。