2010-03-24 206 views
2

如果我們可以通過setter和getters訪問私有成員,那麼private有什麼用?公共和私人訪問修飾符

+1

哪種語言? – 2010-03-24 05:08:34

+3

@Frank並不重要...... – 2010-03-24 05:10:42

回答

1

因爲獲取者和設置者可以充當代理。它們使得你可以隱藏類的實際內部,只允許外部類通過方法訪問數據。無論你想要什麼,都可以讓你對待課堂的內部人員。

僅僅因爲你的getter/setter被命名爲getName()而你的財產被稱爲name,並不意味着它永遠是那樣的。

如果您想將變量更改爲fullName,該怎麼辦?如果您直接訪問公共變量,則更改會破壞很多代碼。相反,您可以簡單重新映射getName()從哪裏獲取數據。

我最好的例子之一是我自己的URL類,我允許創建和操作一個URL。如果你想設置該方案,你可以得到$obj->setScheme()。但是,您不知道每次更改URL時是否手動生成字符串,無論是將它們存儲爲單獨的部分。這給了我靈活性,因爲我可以存儲您的數據,但我想。

此外,我可以在存儲數據之前對數據進行預處理。在我的URL類中,我假定所有的方案和主機名都是小寫的。我可以通過將通過setHost()保存的所有字符串轉換爲小寫,然後存儲它們來標準化。如果我使用公共變量,則必須假定將數據放入的客戶端正確存儲它。

它們還可以驗證正在傳入的信息,以確保它是有效的數據,如果不是,則會導致錯誤。

1

沒有人強迫你爲每個變量放入getter和setter。事實上,即使很多「面向對象的封裝」教程出於某種原因始終這樣做,所以對每個變量盲目使用私有成員+虛擬獲取者& setter是毫無意義的。首先,從併發的角度來看,封裝是沒有封裝。

3

您需要的私人執行封裝。它是面向對象編程的基本範式之一,用於保持獨立於界面的某些東西的實現。這減少了不同程序部件之間的耦合,並且從長遠來看使其更易於維護。

看看下面的例子:

class toto { 
    private String someThing; 

    public String getSomething(); 
    public void setSomething(String Something); 
} 

如果更改上面簡單地把一些公衆,確保你有更少的代碼,但如果有一天,有什麼需要改變,以更復雜的對象一些新功能而舊的代碼仍然可以正常使用字符串,那麼你需要改變一切。通過隔離的東西的內部表示,你可以更容易

class toto { 
    private ComplexSomeThing someThing; 

    public String getSomething(){ someThing.toString();} 
    public void setSomething(String something){ something = new ComplexSomeThing(something);} 
    public ComplexSomeThing (getComplexSomething(); 
    public void setComplexSomething(ComplexSomething someThing); 
} 

還有其他原因,使封裝件好事(TM)進化系統,這僅僅是一個愚蠢的例子來說明這一點。


編輯 有一個辯論有點的,現在來使用保護VS私人或使用屬性的概念類似於在一些語言(DELPHI,C#),而不是getter和setter方法(如Java中)。 受保護的而不是私有的將允許代碼的客戶更容易的更改,但它確實暴露了系統的內部,所以在API的可用性和可維護性之間尋求平衡。然而,封裝的基本原則仍然存在。 無論選擇哪個選項,仍然需要展示連貫且在相同抽象級別上的功能,並隱藏關於如何完成的血淋淋的細節。

對我來說,辯論不是要宣佈對私有的聖戰,而是要找到一種方法來提供可擴展性和靈活性,同時不破壞API的連貫性。

Heresomeinteresting閱讀有關私人,如果你想進一步挖掘。不過,我必須強調,在形成對私人的意見之前,你應該真正掌握encapsulationpolymorphism的概念,它們的表面簡潔性隱藏了一些細微的complexities

0

我認爲你到目前爲止有很好的答案(信息隱藏和所有這些)。只是想添加一個關於使用setter的建議。

正如你所提到的使用訪問器使私有變量有點沒有意義,並且在某些環境中,使用getters和setter的性能後果使它變得毫無價值。

另一方面,如果你沒有這樣的擔憂,我認爲使用getters並不是那麼糟糕,但是在使用setter之前你應該三思。他們讓你的對象可變這是特別難以維護的併發環境。