3

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

4

3 回答 3

3

如果该字段是对可变对象final的引用,则将其设置为防止引用被重新绑定到不同的对象。然而,对象仍然可以被修改,实际上绕过了包含对象的不变性。

为了防止这种情况,您可以制作该字段private(如果他们看不到它,他们就无法修改它)。

例如:

public class Order {
  public final List<OrderLine> order_lines = ...;
}

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

于 2013-10-02T18:27:00.080 回答
0
public class Person{
   public Date birthDate = new Date(615666470l); 
}

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

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

如果您提供具有所需起始属性的构造函数,然后您只允许获取对可以工作的值的引用。

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

于 2013-10-02T18:31:01.900 回答
0

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

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

希望这可以帮助!

于 2013-10-02T18:30:05.707 回答