在创建不可变类时,所有字段都被声明为 final,因此它们的值不能被修改。这没关系,但为什么我们还要将它们声明为私有呢?
问问题
265 次
3 回答
3
如果该字段是对可变对象final
的引用,则将其设置为防止引用被重新绑定到不同的对象。然而,对象仍然可以被修改,实际上绕过了包含对象的不变性。
为了防止这种情况,您可以制作该字段private
(如果他们看不到它,他们就无法修改它)。
例如:
public class Order {
public final List<OrderLine> order_lines = ...;
}
在这里,任何人都可以通过添加/删除/修改订单行来修改订单,即使order_lines
是final
.
于 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 回答