2012-03-01 54 views
4

在我看到的代碼中,有些人經常使用私有變量,例如,Java:私有變量和返回方法的必要性

private static int number; 

而且他們通常有訪問方法,比如

public static int returnNumber(){ 

    return number; 

} 

但我的問題是,有什麼意義呢?我做的方式是這樣的

int number; 

跟此,當我需要訪問它

int numberToBeAssigned = someClass.number; 

代替

int numberToBeAssigned = someClass.getNumber(); 

對我來說,似乎不切實際的使用訪問方法和私人變量,我知道他們在做什麼,私有變量只允許被它們所在的類訪問。我只是沒有看到他們的必要性,當你可以很容易地實例化類並在需要時調用它的成員變量。我的邏輯顯然是錯誤的,但我希望有人給出一個關於如何使用私有變量和訪問器方法的明確例子。

謝謝

+1

這將會很快被關閉爲「非建設性」,但讓我只是說你不是*錯誤*,你可能從來沒有在任何真正的*大* *上工作過。 'private'可以讓你保證「只讀變量」,如果沒有這些,調試可能是一個不容錯過的噩夢。 – 2012-03-01 21:50:53

回答

6

存取的點這樣是爲了讓你重新設計的實施而不會破壞你的代碼中所有的休息。例如,如果您稍後決定該number應該來自文件呢?還是應該搬到另一個班上?

您限制訪問要經過一個存取,那麼你就可以做出這樣的改變,你只需要改變存取 - 您不必改變所有依賴於它的其他代碼。

+0

非常好!這現在更有意義了。謝謝。 – Blackvein 2012-03-01 21:52:01

0

這裏是從wikipedia的立體:

隱藏內部的對象保護通過防止用戶在組件的內部數據設置成無效的或不一致狀態其完整性。封裝的一個好處是它可以降低系統複雜性,從而增強穩健性,允許開發人員限制軟件組件之間的相互依賴關係。

2

這是關於封裝。公共字段讓任何ol類都會出現並改變你的值,並可能破壞你的不變量。如果你只有一個public int foo,任何人都可以設置它。如果這是一個private int foo並且你提供了一個吸氣劑,人們只能得到它。如果你提供了一個吸氣和二傳手,那麼他們可以做到這一點,但是你仍然可以控制它;你可以拒絕一個會破壞班級必須(或者想要)做出的假設的改變。

這可能是因爲你現在在這個階級中沒有任何這樣的假設,但是a)你將來可能會有一些b)其他階級確實有這些假設,因此需要保護他們的私人領域,並且擁有一致的訪問數據的方式(在某些情況下不是字段,在其他情況下不是字段)是很好的。

真的不過,這是關於基本原則OO:你的類不只是一個國家的斑點,這是一個東西其中有屬性和動作 - 與引擎蓋下有狀態,以反映這些行動。因此,例如,當您要求輸入Listlength()時,您在概念上並不關心是否將其報告爲緩存值或是否對其元素進行迭代並對其進行計數;你只是想要它的長度。

這給我們帶來了最後一個重點(至少在這個答案:)),這是一個getter和setter可以被覆蓋以利用繼承,而一個字段不能。

0

有很多關於這些問題的書籍,答案不能真正用一個計算器答案格式來解釋。其實這很重要。長話短說,您在代碼中提供的評估者越少,在重構時必須更改它的機會越多,而不會損害那些使用它的代碼。你的代碼變得乾淨而健壯,你可以達到更好的不變性水平,你可以做出更好的架構決策。

0

簡短的回答: 您想在發佈短短一個組成部分,作爲是必要的它仍然儘自己的一部分,並通過執行該組件在應用程序中儘可能地爲它的行爲孤立的行爲,儘量減少不必要的互動(可以輕鬆測試的地方)。

較長的回答: 類型的方法代表它的合同,而它的變量代表它的狀態。任何不平凡的類型都將包含多個成員變量,以及它們自己的相關狀態。隨着該類型(其合約)提供的功能(新功能或擴展功能,錯誤修復),程序員必須牢記所有這些關係,以確保現有行爲不被破壞。

一個成熟的方法來實現,就是編寫單元測試,但這些只是單獨驗證類型。通過儘量減少類型狀態的說明並將其限制爲易於理解和計劃的操作,程序員會盡量減少他或她能夠測試的模型的中斷。

相反,如果外部組件有辦法訪問組件狀態超出該類型的設計者所規劃的組件狀態,那麼它們很容易被無意中破壞其行爲。組件之間的交互是指數級的:根據我的經驗,一旦程序理解了20,000多行代碼,是由多個開發人員編寫的,每個開發人員分別專門從事不同的模塊,並且經過多次修訂,沒有人會對整體有完美的想法代碼了。

關於這個話題已經寫了很多書和文章,我相信他們會比我更有說服力和說服力。對於Java中的一般最佳實踐,我強烈推薦Josh Bloch的Effective Java(第2版)。