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

问题描述 投票:3回答:3

在创建一个不可变类的时候,所有的字段都声明为final,这样它们的值就不能被修改。这是好的,但为什么我们也要把它们声明为私有?

java immutability private final
3个回答
3
投票

如果这个字段是对一个可变对象的引用,那么将它变成 final 将防止该参考文献被 反弹 到一个不同的对象。然而,这个对象仍然可以被修改,这实际上是侧避了包含对象的不可更改性。

为了防止这种情况,你可以将字段 private 如果他们看不到,就不能修改)。

比如说。

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

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


0
投票

一个不可变的对象在被创建后不能改变,但这并不意味着它一定有一个简单的实现,应该被输出到所有的客户端。 举个例子,以 String 类型,它使用了很多疯狂的幕后优化,以最大限度地提高常见情况下的效率(例如,在使用 substring). 通过隐藏类的所有字段,实现可以尝试利用节省时间或空间的优化,并通过公共接口调解对存储数据的访问。 如果这些字段是公开的,那么事后就很难(如果不是不可能)改变实现。

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

希望这能帮到你!


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

那么任何人都可以从外部更新birthdayDate。

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

如果你提供一个带有所需的起始属性的构造函数,然后你只允许获取对值的引用,那就可以了。

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

© www.soinside.com 2019 - 2024. All rights reserved.