在创建不可变类时,所有字段都被声明为final,以便它们的值不能被修改。这没关系,但为什么我们也将它们声明为私有
答案 0 :(得分:3)
如果该字段是对可变对象的引用,则使其final
将阻止引用反弹到另一个对象。但是,仍然可以修改对象,实际上是包含对象的侧步不变性。
为防止这种情况发生,您可以设置字段private
(如果他们看不到,则无法对其进行修改)。
例如:
public class Order {
public final List<OrderLine> order_lines = ...;
}
此处,即使order_lines
为final
,任何人都可以通过添加/删除/修改订单行来进入并修改订单。
答案 1 :(得分:0)
不可变对象在创建后无法更改,但这并不意味着它必须具有应导出到所有客户端的简单实现。例如,采用String
类型,它使用大量疯狂的幕后优化来最大化常见情况的效率(例如,在使用substring
时共享后备阵列)。通过隐藏类的所有字段,实现可以尝试利用节省时间或空间的优化并通过公共接口调解对存储数据的访问。如果这些字段是公开的,那么在事后改变实施将是困难的(如果不是不可能的话)。
换句话说,不变性并不意味着封装,反之亦然。
希望这有帮助!
答案 2 :(得分:0)
public class Person{
public Date birthDate = new Date(615666470l);
}
然后任何人都可以从外面更新birthDate。
Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270);
如果您为构造函数提供了所需的起始属性,那么您只允许获取对值有效的引用。
还记得不要在get方法中返回实际对象(至少它们本身是不可变的)。