为什么在创建不可变类时,字段被声明为私有?

在创建不可变类时,所有字段都被声明为final,以便它们的值不能被修改。这没关系,但为什么我们也将它们声明为私有

如果该字段是对可变对象的引用,则将其设置为final将阻止引用被反弹到另一个对象。 但是,仍然可以修改对象,实际上是包含对象的侧步不变性。

为防止这种情况,您可以将该字段private (如果他们看不到,则无法对其进行修改)。

例如:

 public class Order { public final List order_lines = ...; } 

在这里,任何人都可以通过添加/删除/修改订单行来进入并修改订单,即使order_linesfinal

不可变对象在创建后不能更改,但这并不意味着它必须具有应导出到所有客户端的简单实现。 例如,采用String类型,它使用大量疯狂的幕后优化来最大化常见情况的效率(例如,在使用substring时共享后备数组)。 通过隐藏类的所有字段,实现可以尝试利用节省时间或空间的优化并通过公共接口调解对存储数据的访问。 如果这些字段是公开的,那么在事后改变实施将是困难的(如果不是不可能的话)。

换句话说,不变性并不意味着封装,反之亦然。

希望这可以帮助!

 public class Person{ public Date birthDate = new Date(615666470l); } 

然后任何人都可以从外面更新birthDate。

 Person porfiriopartida = new Person(); porfiriopartida.birthDate=new Date(931199270); 

如果您为构造函数提供了所需的起始属性,那么您只允许获取对其起作用的值的引用。

还记得不要在get方法中返回实际的对象(至少它们本身是不可变的)。