同时创造不可改变类所有的字段都声明为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
封装原则规定您尽可能少地暴露于外部世界。 –