回答
因此,沒有人可以從外部訪問它並依賴該值,從而使您可以自由地改變它,而不會產生副作用(至少在聲明它的類之外)。
此答案不完整。 @ A4L給出了一個更完整的答案。 –
將變量保持在適當的範圍內,這是最好的OOP練習。一個例子是一個全局靜態的最終整數,用於在類中執行一些計算。暴露(公開)不僅會造成問題,還會造成混亂。
說你有,你需要知道圓周率的值類:
public class MyClass {
private static final double PI = 3.14159;
//functions performing calculations with value of PI
}
圓周率的值只需要內MyClass
,所以把它留給被暴露是沒有意義的 - 與所有的計算變量在MyClass
之內完成。如果您再次需要它來執行計算,則應該在保持代碼組織的類的類中完成。
_暴露(公開)不僅可能會導致問題,而且還會造成混淆。請詳細瞭解這一點。這是答案中有趣的部分。 –
@SotiriosDelimanolis當然可以!沒有意識到我不得不更詳細地討論,但我很樂意。 –
有serveral的原因...
隱私
保持實施細則,從客戶端隱藏,用於內部使用例如常量只有與沒有使用客戶
安全
保護您的代碼免受惡意客戶端代碼侵害,例如:
static class A
{
public final static List<String> list = buildList();
public static List<String> buildList()
{
ArrayList<String> list = new ArrayList<>();
list.addAll(Arrays.asList("A", "B", "C"));
return list;
}
}
static class B
{
public static void main(String[] args)
{
A.list.clear();
System.out.println(A.list);
}
}
你不想讓任何人操縱你的內部數據。
我認爲你的例子與你的答案不一致。 'list'沒有真正的保護,可以修改。你可以防止它,如果生成列表將返回'Collections.unmodifiableList(Arrays.asList(「A」,「B」,「C」));' – user902383
@ user902383這就是爲什麼的例子,即表明它不是因爲這個問題是關於'private static final'的問題,如果這個列表是公開的或者是受保護的,那麼它肯定會被一個不可修改的集合保護,就像你在你的評論或者副本中指出的那樣。 – A4L
在你的列表聲明中使用什麼關鍵字並不重要,如果提供的實現將是'ArrayList',它的內容可能會改變。 – user902383
靜態修飾符與最終修飾符一起也用於定義常量。最終修飾符表示該字段的值不能更改。
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
如果聲明公共靜態最終變量,該變量就能夠看出來的網站它的類。如果有人試圖改變其他類中的值,它可能會在編譯時造成潛在的錯誤。
如果聲明靜態final變量爲private,則它隱藏在其他類中。所以你可以避免這樣的錯誤。
- 1. 在C++的類中聲明私有靜態變量
- 2. 爲什麼變量應聲明爲靜態和最終
- 3. enum中的私有靜態最終變量
- 4. 在JavaScript中聲明私有靜態成員變量
- 5. 爲什麼不能在非靜態塊中聲明靜態最終變量?
- 6. 使用Powermock嘲弄靜態私有最終變量?
- 7. 靜態最終變量
- 8. 靜態最終變量
- 9. 靜態私有變量
- 10. 私有靜態變量
- 11. 非靜態私有變量
- 12. 聲明靜態私有數組成員
- 13. 不使用靜態變量的原因?
- 14. 最終靜態與非最終靜態變量?
- 15. '公共靜態最終'或'私人靜態最終'與getter?
- 16. 是否有動態變量不是私有的原因?
- 17. 靜態變量聲明的時間
- 18. JAVA中的實例變量的公共靜態最終聲明接口
- 19. 失敗修改私人最終靜態變量無一例外
- 20. 靜態變量正在重置,原因不明
- 21. 局部變量需要最終聲明
- 22. 非最終靜態變量的用例
- 23. .properties作爲最終的靜態變量
- 24. 聲明全局靜態變量
- 25. 聲明靜態變量在單
- 26. 聲明和放置靜態變量
- 27. 在函數中聲明靜態變量
- 28. 如何聲明靜態變量
- 29. ios - 如何聲明靜態變量?
- 30. 在主內部聲明私有變量
僅僅因爲這個字段是final的,並不意味着它引用的對象是不可變的,所以你可能仍然需要封裝它。 – Andreas
記錄器是一個很好的例子,請參閱http://stackoverflow.com/questions/26241787/declaring-variable-final-and-static?rq=1 –
或者只是任何不需要暴露的東西,以保持API小。 –