同時創造不可改變類所有的字段都聲明爲final,這樣他們的價值不能是modified.this是好的,但爲什麼我們還宣佈爲私人爲什麼在創建不可變類時,字段被聲明爲私有?
回答
如果該字段是一個可變對象的引用,使得它final
將防止參考反彈到不同的對象。然而,對象仍然可以被修改,實際上是包含對象的側向不變性。
爲了防止這種情況,您可以將字段private
(如果他們看不到它,他們不能修改它)。
例如:
public class Order {
public final List<OrderLine> order_lines = ...;
}
在這裏,任何人都可以進來,並通過添加/刪除/修改訂單行,即使是order_lines
修改final
的順序。
我認爲這個問題是關於他們爲什麼是'私人',而不是'最後'。 – templatetypedef
>「如果他們不能看到它,他們不能修改它」 - 不正確 –
@SargeBorsch:精心製作。 – NPE
不可變的對象在創建後不能更改,但這並不意味着它必須有一個簡單的實現應導出到所有客戶端。例如,採用String
類型,該類型使用大量瘋狂的幕後優化來最大化常見情況下的效率(例如,在使用substring
時共享支持數組)。通過隱藏類的所有字段,實現可以嘗試利用時間或空間節省的優化,並通過公共接口調解對存儲數據的訪問。如果這些領域是公開的,那麼在事實之後改變實施將是困難的(如果不是不可能的話)。
換句話說,不可變性並不意味着封裝,反之亦然。
希望這會有所幫助!
我是一個新手編程...所以我不能夠了解你的類似的解釋「隱藏類的所有 的領域, 實現可以嘗試的時間或 節省空間的優化 乘虛而入」 可以ü請通過採取另一種基本的例子:(解釋 – vidyashi
public class Person{
public Date birthDate = new Date(615666470l);
}
然後任何人都可以從外面更新birthDate。
Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270);
如果你提供了一個構造函數所需的起始屬性,然後你只允許引用值的工作。
還記得不要返回get方法中的實際對象(至少它們本身是不可改變的)。
- 1. 爲什麼變量被聲明爲TStrings並創建爲TStringList?
- 2. 爲什麼建議將實例變量聲明爲私有?
- 3. 爲什麼我不能創建我的私有變量,我聲明它?
- 4. 爲什麼只有靜態字段可以聲明爲'const'?
- 5. 爲什麼main不被聲明爲extern
- 6. 爲什麼要在Java中聲明一個不可變類final?
- 7. 什麼類型可以聲明爲const?
- 8. 爲什麼WebFrameLoadDelegate被視爲未聲明?
- 9. 爲什麼Reads沒有聲明協變?
- 10. 爲什麼GenSet聲明具有不變類型參數?
- 11. 何時聲明方法爲私有
- 12. 爲什麼成員函數仍然可以被訪問,即使它被聲明爲「私有」?
- 13. Scala不可變集在聲明爲變量時是可變的
- 14. 爲什麼變量名稱應該被聲明爲「錯誤?
- 15. 聲明作爲全局變量在類中創建的變量
- 16. 爲什麼Android提取一個類的聲明字段無效?
- 17. 爲什麼HttpServlet類被聲明爲抽象?
- 18. 爲什麼在聲明變量時CGSize不使用*?
- 19. 爲什麼在讀回私有類變量時會得到EXC_BAD_ACCESS?
- 20. 爲什麼建議在聲明變量時儘可能使用最窄範圍?
- 21. 聲明一個不變的類字段
- 22. 爲什麼不能在類中聲明const靜態字符串
- 23. 爲什麼我不能在類中聲明一個字符串?
- 24. Segmentation Fault聲明類私有變量
- 25. 將事件聲明爲字段或屬性,有什麼區別?
- 26. 變量或字段'commonStack'聲明爲空
- 27. 爲什麼在基類中聲明的簽名被忽略?
- 28. 當F#記錄的字段被聲明爲私有時,奇怪的可訪問範圍
- 29. 在類中創建的對象可以訪問私有字段..並且在不同類中創建的對象不是爲什麼?
- 30. 爲什麼可以從屬性訪問私有常量字段?
你知道'私人'的能見度是什麼嗎? –
@Sotirios Delimanolis如果有任何成員是私人的,那麼它不能在課堂以外訪問 – vidyashi
封裝原則規定您儘可能少地暴露於外部世界。 –