2011-05-05 49 views
1

我正在编写一个不可变类。其中一个实例是另一个可变类的对象。如何防止修改该实例的状态。Java不可变类疑问

+1

你能详细点吗?你的解释是自相矛盾的。如果它是一个不可变类,那里面没有可变变量。 – Ingo 2011-05-05 08:21:17

+0

请参阅我编辑的问题 – Ammu 2011-05-05 08:23:23

回答

5

如果您向所有获得者提供委托,但不为该字段本身提供获取者。例如:

public final class Foo { 
    private Bar bar; 

    public String getBarField1() { 
     return bar.getBarField1(); 
    } 
    public String getBarField2() { 
     return bar.getBarField2(); 
    } 
} 

但有一点需要考虑 - 该领域是如何创建的。如果它在构造函数中传递,那么您必须创建它的副本而不是获取传递的对象,否则创建代码将引用Bar实例并能够修改它。

+0

还应限制继承。所以,有必要让班级最终成为现实。 – 2011-05-05 08:22:48

+0

同意。 (15chrs) – Bozho 2011-05-05 08:23:20

3
  1. 使可变私人
  2. 仅允许经由吸气剂(getVarNameProperty1()getVarNameProperty2())获得变量的字段;
  3. 为了拒绝继承,使类最终。在孩子阶级中,可以创建一个公共获取者。
+0

您不能允许访问具有getter的变量。 getters将返回对变量的引用,这将允许更改不可变内部状态。 变量必须在内部锁定。 – 2011-05-05 08:50:33