2011-11-03 140 views
4

這個問題困擾了我一陣子。可以直接訪問的公共屬性,還是帶有getter的私有屬性?哪一個更好/更正,爲什麼?公共財產VS私有財產與getter?

+2

你的意思是 「田」,而不是 「屬性」,我認爲? – skaffman

+2

我覺得好像之前已經問過這個問題。 – Woot4Moo

回答

7

直接暴露字段被認爲是不好的做法。

最好讓字段保持私有狀態,只暴露getter和setter。一個好處是你可以爲getter和setter選擇不同的訪問級別,而一個字段只有一個訪問級別。使用getter的另一個好處是,它允許您在不更改類接口的情況下更改實現。

更好的辦法是在可能的情況下避免獲取者和設置者。而是使用封裝更高級別行爲的方法。這是因爲對象不應該篡改其他對象的內部狀態(通過直接訪問字段,或通過獲取者和設置者間接)。

相關

+4

缺乏「爲什麼」。 – delnan

+0

感謝您的鏈接! – Pouya

0

從修改你的對象保持電場私人防止其他類,認爲繼承模型,其中一個孩子可以操作它的父的領域。

1

通常最好使用getter而不是public字段,因爲使字段爲private並暴露getter可以防止調用者能夠修改字段,並且可以在不更改接口的情況下更改以後的實現。

此規則的一個例外是邏輯常量,例如,人們通常更喜歡公共靜態最終字段:Days.SATURDAY而不是days.getSaturday()。但是,如果價值是附加到特定實例而不是類別,或者可以改變,或者通常不會覺得它是必須是一個普遍常數,私人領域/公共getter提供的靈活性使它更可取。

3

私有財產與getter(和可能的setter)被認爲是適當的風格,因爲聲明它們是公開的,直接使用它們會損害封裝原則。它可能導致的其中一個問題是,您直接依賴於該領域的實施類型,如果需要出現,以後更難更改。

此外,getters/setters允許您添加訪問和變異過程的邏輯。您可以執行邊界檢查,輸入驗證,用缺省值替換NULL ...

然後,在許多情況下,像大多數JavaBeans一樣,getters/setter只會做直接訪問。所以整個事情在JavaBeans上下文中是有爭議的。

我的看法?整個事件被嚴重誇大了,它引發的討論的數量已經吃了足夠的時間和鍵盤筆畫來創建一個具有適當屬性的全新Java語言規範。不要聽信條,做最適合你的事情,不要停下來思考什麼是沒有意義的。如果大家都接受了上面的話,我們可能仍然在編寫代碼。

+0

我同意。讓你的課程/接口保持私密,並隨你做他想做的事情。只有在需要公開時才擔心這種情況。 – emory

0

請務必將字段聲明爲私有。假設你有一個銀行賬戶,並且你想畫一些現金:

public class BankAccountWithprivateField 
{ 
    private Cash cash; 

    // ... 

    public void draw(int amount) 
    { 
     if(amount <= balance) cash.draw(amount); 
     else sentMessage("Sorry your balance is less than what you request!"); 
    } 
} 

// ... 

new BankAccountWithprivateField().draw(500); 

在這裏,你不能比你的餘額更多。

public class BankAccountWithPublicField 
{ 
    public Cash cash; 

    // ... 
} 

// ... 

new BankAccountWithPublicField().cash.draw(1000000); 

但在這裏,你可以抽1百萬美元)

+1

我不想在新的垃圾回收BankAccount上有100萬美元的債務。 – Robert