2013-10-02 41 views
2

同时创造不可改变类所有的字段都声明为final,这样他们的价值不能是modified.this是好的,但为什么我们还宣布为私人为什么在创建不可变类时,字段被声明为私有?

+1

你知道'私人'的能见度是什么吗? –

+0

@Sotirios Delimanolis如果有任何成员是私人的,那么它不能在课堂以外访问 – vidyashi

+0

封装原则规定您尽可能少地暴露于外部世界。 –

回答

3

如果该字段是一个可变对象的引用,使得它final将防止参考反弹到不同的对象。然而,对象仍然可以被修改,实际上是包含对象的侧向不变性。

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

例如:

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

在这里,任何人都可以进来,并通过添加/删除/修改订单行,即使是order_lines修改final的顺序。

+0

我认为这个问题是关于他们为什么是'私人',而不是'最后'。 – templatetypedef

+1

>“如果他们不能看到它,他们不能修改它” - 不正确 –

+0

@SargeBorsch:精心制作。 – NPE

0

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

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

希望这会有所帮助!

+0

我是一个新手编程...所以我不能够了解你的类似的解释“隐藏类的所有 的领域, 实现可以尝试的时间或 节省空间的优化 乘虚而入” 可以ü请通过采取另一种基本的例子:(解释 – vidyashi

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

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

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

如果你提供了一个构造函数所需的起始属性,然后你只允许引用值的工作。

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

相关问题