2013-08-19 31 views
1

考慮以下Java代碼:在java中,爲什麼設置setter和getter的字段爲public是不好的?

public class SomeClass{ 
    private int data; 
    public void setData(int data){ 
     this.data = data; 
    } 
    public int getData(){ 
     return this.data; 
    } 
} 

在上面的代碼數據的值可以從任何地方訪問。那麼爲什麼不公開實地數據呢?

+0

您可能想要閱讀這個其他答案:[Java Encapsulation](http://stackoverflow.com/a/11970468/697630) –

回答

3

因爲您可以控制其他類如何設置數據。

您可以對輸入進行預先檢查,甚至根據您可能具有的某些規則修改輸入。

例如:

public class SomeClass{ 
private int data; 
public void setData(int data){ 
    if (data < 1000){ 
     this.data = data; 
    } 
    else{ 
     data = -1; 
    } 
} 
public int getData(){ 
    return this.data; 
} 

}

+1

想想讓每個變量都是公開的(不僅僅是原語)。你不可避免地遇到了一個路障,你不能在沒有進行某種預處理的情況下將變量'A'設置爲變量'B'。 –

7

爲什麼getter和setter?

很多人想知道爲什麼我們需要Java中的訪問器和增變器方法(a.k.a. getters和setters),爲什麼我們不能直接訪問數據呢?但是封裝的目的不在於隱藏數據本身,而在於如何處理這些數據的實現細節。因此,我們想要的是一種提供公共接口的方式,通過它我們可以訪問這些數據。我們稍後可以更改數據的內部表示而不會影響該類的公共接口。相反,通過暴露數據本身,我們會妥協封裝,從而影響將來操縱這些數據的方式,而不會影響其用戶。我們將創建一個與數據本身的依賴關係,而不是該類的公共接口。當「變化」終於找到我們時,我們將創造一個完美的雞尾酒。

有幾個令人信服的原因,我們可能想要封裝訪問我們的領域。這些原因的最佳彙編在Joshua Bloch的書Effective Java中有描述。有項14:儘量減少類和成員的可訪問性,他提到幾個原因,這是我在這裏提到:

  • 您可以限制(即性別觀點必須是F或M)存儲在字段中的值。
  • 您可以在字段被修改時觸發操作(觸發事件,驗證等)。
  • 您可以通過同步方法來提供線程安全性。
  • 您可以切換到新的數據表示(即計算的領域,不同的數據類型)
  • 你可以做一個現場只讀
  • 等等

但是,它是理解很重要封裝不僅僅是隱藏字段。在Java中,我們可以通過隱藏整個類來隱藏整個API的實現細節。

我對這個重要概念的理解被我閱讀了Alan Snyder撰寫的一篇名爲Encapsulation and Inheritance in Object-Oriented Programming Languages的偉大文章所擴大和豐富,我向所有讀者推薦這篇文章。

0

有時情況要求某些變量只能讀取或寫入目的。你可以通過getter和setter方法實現它。 如果你將變量設爲public,那麼它可以被訪問,並且可以使用類對象改變它的值。 這種類型的模式是調用POJO。POJO is an acronym for Plain Old Java Object. The name is used to emphasize that a given object is an ordinary Java Object, not a special object.

Link可以回答你的問題和谷歌了POJO類的優點了解更多信息。

1

即使看起來使用getter/setter方法現在沒有意義,因爲它們沒有做任何有趣的事情,所以您需要考慮將來需求變化時會發生什麼。您可能會發現在設置值時需要添加一些驗證;你可能會發現你需要改變整個實現,以便「get」方法實際上是從幾個數據計算出一個值,或者從一個文件中讀取某個值。當發生這種情況時,如果您有其他課程直接訪問data,您將被擰緊。您將無法按照您需要的方式更改實施,而不會有太多的痛苦。我從長期痛苦的經歷中解脫出來,經歷了維護其他人潦草的代碼的痛苦。

相關問題