我很困惑過,是因爲其具有Object A
內的type B
最終場b
只是確保該字段b
不能再實例化但A
狀態可仍然在內部或外部操縱b
被改變,所以如何做這裏最後的目的是不可變的嗎?對象不可變與對象的引用是不可變的是什麼區別?
1
A
回答
3
final
有助於實現一個不可變對象。不可變對象必須確保它擁有的任何對象本身是不可變的,或者至少不能公開可變。
有在Java中沒有不可改變皇家路徑(或以其他方式,我可以補充)。
4
對你最後一個問題的簡單回答是:它沒有。
除非有沒有辦法變異「B」的狀態,最終將獲得你什麼關於「一」的可變性。
這些是正交的概念,然而在一切可能的地方使用「最終」將幫助你實現目標不可改變,但它是沒有必要的,你也離不開誰。
0
我不是100%確定,但我認爲差異本質上是這樣的,使用final
關鍵字只是保證你作爲程序員,變量會在執行過程中始終引用同一個對象。然而,沒有什麼能夠阻止對象本身以某種方式改變。
考慮以下僞代碼:final Car c = new BMW(Color.Green, new Milage(0));
的代碼,你可以不分配c
到奧迪,或福特以後,但沒有限制「使用」您的BMW,以便它在路線milage增加你的程序。
1
製作領域final
提供一個編譯時檢查一個被不修改到B.
的參考雖然這不足以保證A的不變性,它是有幫助的。
防禦性拷貝可以防止外部修改b引用的可變對象。可以爲A構造函數接收的對象和A訪問器返回的對象創建防禦性副本。
0
對象是不可變的 - 意味着數據或在該對象中的變量瓦萊斯不能改變設置一次。
參考不可變 - 是指被指向該對象的變量是一個最終變量。
相關問題
- 1. 可變對象和不可變對象之間的區別
- 2. 什麼是不可變對象?
- 3. 不可變對象和有效不可變對象之間的區別?
- 4. 爲什麼不可變的對象拋出UnboundLocalError但可變的對象不?
- 5. 是System.Security.SecureString對象是不可變還是可變的?
- 6. 不可變和可變變量的區別是什麼?
- 7. 與對象initialisers不可變對象
- 8. 添加時,對i32的不可變和可變引用有什麼區別?
- 9. javascript:File對象是不可變的嗎?
- 10. jQuery對象是不可變的?
- 11. ReadonlyCollection,對象是不可變的嗎?
- 12. 除了Java中的String之外,什麼是不可變對象?
- 13. 爲什麼String對象在java中是不可變的?
- 14. 爲什麼不可變對象是線程安全的?
- 15. django - 爲什麼request.POST對象是不可變的?
- 16. 不可變對象內的可變對象
- 17. Java是否優化不可變對象?
- 18. 包裝對象中的不可變對象引用
- 19. Wy是不考慮可變/引用對象的泡菜?
- 20. 不可變的,爲什麼我使用fromJS的嵌套對象在使用重選時不是不可變的
- 21. 將不可變對象轉換爲可變對象(遞歸)的最佳方法是什麼?
- 22. 對象和變量有什麼區別?
- 23. 是什麼是什麼的區別新對象{}和新的對象(){}
- 24. 將可變對象轉換爲不可變對象
- 25. 爲什麼我不能聲明對可變對象的引用? ( 「參考不能聲明可變」)
- 26. 對象不可變異
- 27. 更新不可變對象
- 28. Hibernate不可變值對象
- 29. 有效不可變對象
- 30. 爲什麼我的不可變對象突變Scala