2016-06-21 58 views
5

最近,我得到了一個代碼審查評論,使用getter方法訪問同一類中的私有實例變量。這真的是一個好習慣嗎?我覺得它在代碼中增加了不必要的複雜性。推薦的方式是什麼?使用getter訪問私有實例變量是否是一種很好的編碼習慣

public class SomeClass { 
    String abc; 

    public boolean compare(SomeClass otherClass) { 
     otherClass.getAbc().equals(abc); 
    } 
} 

public class SomeClass { 
    String abc; 

    public boolean compare(SomeClass otherClass) { 
     otherClass.getAbc().equals(getAbc()); 
    } 
} 
+3

我通常不打擾。我在班上,數據屬於班級。 – azurefrog

+1

當在這個類中時,沒有理由使用getter和setter。他們只是爲了以受控的方式暴露私人變量。 –

回答

5

我看到一個非常具體的問題,你的第一種方法。你使用的getters不一致。

public boolean compare(SomeClass otherClass) { 
    otherClass.getAbc().equals(abc); 
    //.getAbc() for one, but direct access for the other!! 
} 

您有一個equals方法來比較蘋果蘋果,如果你的變量中的一個檢索使用的吸氣劑(我假設是公共的,可以被覆蓋)相比,另一種是直接檢索一個私有變量(不能被覆蓋),那麼你已經使你的代碼比它需要的更加脆弱。如果有人擴展你的班級並改變getter方法會怎麼樣?你的代碼將被徹底清理。因此,對兩者都使用getter或不使用getter。

考慮到這一點,無論這些是不是你原來的更好,因爲行爲更穩定:

public boolean compare(SomeClass otherClass) { 
    otherClass.abc.equals(abc); 
} 


public boolean compare(SomeClass otherClass) { 
    otherClass.getAbc().equals(getAbc()); 
} 

對於一般用途,這取決於你如何使用這些數據。大衛的答案列出了一些使用getter的資源。

您的評論者完全有可能只談論一般情況,但我認爲他們可能只是很少傳達這個問題。

+0

我聽過相同的評論評論念頌作爲口頭禪。我使用了很多具有泛型getter和setter的代碼,這看起來總是浪費。在閱讀了我鏈接的文章後,我想我應該多學習一些更好的封裝設計。我懷疑很多評論者也不太瞭解封裝。 –

3

理論上,在類中使用getter和setter可以提供代碼重用,例如,如果setter進行某種範圍檢查,這在類中也很有用。在實踐中,我從來沒有見過這種情況真的有益。

理想情況下,一個類不應該有setter和getters。

爲什麼沒有安裝者?因爲它們提供了可導致很多問題的可變狀態。理想情況下,類變量應該在構造函數中分配,並且以後再也不會更改。

爲什麼沒有獲得者?因爲一個班級應該作爲一個單位。創建一個類的目的不僅僅是爲不同的變量提供一個臨時容器,以便一個接一個地提取它們。這不是封裝。

相關問題