2013-03-10 68 views
4

因爲它被認爲是不好的OO實踐中有一個類中的公共變量(而不是使用getters和setters)那麼爲什麼不使用private所有變量?爲什麼Java甚至允許使用public,如果這是不好的做法?Java:當不使用`私人`

(這並不適用於功能,很明顯)

+1

無論我在答案中拋出了2分錢,我都不認爲這個問題是可以回答的,只是猜測(其中有很多),因此Gosling停下來解釋自己。 – millimoose 2013-03-10 20:45:41

回答

8

public static final變量是例如一個很好的理由。像一個常數。

2

變量字段的訪問控制不是唯一的問題。

考慮簡單。 Java對所有類型的訪問控制都有一個默認值。比不同類型的訪問規則更容易學習。

考慮可用性爲新用戶。如果默認情況下所有內容都是私密的,那麼新用戶更可能會對爲什麼不能訪問某些東西感到困惑。

最後,請注意,「獲得者和制定者」並不總是適合公共領域的替代方案。一些字段不應該修改,甚至不能在課堂外進行訪問。

[編輯]還有一個歷史原因背後的選擇。 Java的最早版本,當時稱爲「Oak」,沒有私人訪問。默認和最受限制的訪問是受軟件包保護的。 (參考:2002 Java newsletter,引用Oak 0.2 manual。)

4

擁有publicprivate字段是設計決定。該語言本身應該是使程序員做出自己的設計決策,而不是強制執行開發人員或團隊可能不一定要實現的設計。

語言越靈活,它就越強大。由項目經理,團隊或個人開發人員決定最適合訪問字段的方式。

0

這是一個管理複雜性的問題。

A public成員可以從課堂以外進行訪問,實際考慮意味着「可能在任何地方」。如果public字段出現問題,罪魁禍首可能在任何地方,所以爲了追蹤錯誤,您可能需要查看相當多的代碼。

A private成員只能從同一個類內部訪問,所以如果出現問題,通常只有一個源文件需要查看。如果您的項目中有一百萬行代碼,但您的課程保持較小,這可以大大減少您的錯誤跟蹤工作量。

另一個優點涉及coupling的概念。有些答案忘了提到這一點。

我想說默認情況下所有東西都是private,然後只顯示絕對必須是public(或者只是使用getter和setter)的那些部分。你越能做出更好的private

0

我想很好的一部分原因是「C++做到了這一點」。不同的語言在這個問題上不同意,所以它顯然不是唯一明智的選擇。例如。 Python擁有一切公開的內容,並且信任你遵循圖書館的文檔,而Ruby只有私人領域。

0

這是關於你想要在哪裏發佈該領域。

對於public領域,你可以安全地用於final領域做到這一點,像常量:

public static final ... 

而且final領域:

public final ... 

像Java數組的length領域。雖然這個慣例是提供一個訪問方法(getter),而不是公開某個字段。

當您要將字段發佈到 子類時,請使用protected字段。

如果要將字段發佈到同一包中的其他類,請使用默認可見性(即未指定)。

0

我認爲這很有可能(不包括static final常量),因爲你可以用它來快速解決一些問題(而不是定義getter和setter),你只需要在這裏小心打破封裝規則。