在创建一个不可变类的时候,所有的字段都声明为final,这样它们的值就不能被修改。这是好的,但为什么我们也要把它们声明为私有?
如果这个字段是对一个可变对象的引用,那么将它变成 final
将防止该参考文献被 反弹 到一个不同的对象。然而,这个对象仍然可以被修改,这实际上是侧避了包含对象的不可更改性。
为了防止这种情况,你可以将字段 private
如果他们看不到,就不能修改)。
比如说。
public class Order {
public final List<OrderLine> order_lines = ...;
}
在这里,任何人都可以进来修改订单 通过添加removing修改订单行,即使... order_lines
是 final
.
一个不可变的对象在被创建后不能改变,但这并不意味着它一定有一个简单的实现,应该被输出到所有的客户端。 举个例子,以 String
类型,它使用了很多疯狂的幕后优化,以最大限度地提高常见情况下的效率(例如,在使用 substring
). 通过隐藏类的所有字段,实现可以尝试利用节省时间或空间的优化,并通过公共接口调解对存储数据的访问。 如果这些字段是公开的,那么事后就很难(如果不是不可能)改变实现。
换句话说,不可变性并不意味着封装,反之亦然。
希望这能帮到你!
public class Person{
public Date birthDate = new Date(615666470l);
}
那么任何人都可以从外部更新birthdayDate。
Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270);
如果你提供一个带有所需的起始属性的构造函数,然后你只允许获取对值的引用,那就可以了。
另外,记住不要在get方法中返回实际的对象(至少本身是不可变的)。