Java不可变类规则

Jav*_*ser 4 java immutability

以下类是不可变的:

final class MyClass {
    private final int[] array;
    public MyClass(int[] array){
        this.array = array;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 21

不,不是因为数组的元素仍然可以更改.

int[] v1 = new int[10];
MyClass v2 = new MyClass(v1);
v1[0] = 42;  // mutation visible to MyClass1
Run Code Online (Sandbox Code Playgroud)

  • @Chaos:它不可能是一个包装器.它必须获取传入的数组的副本.它无法包装原始调用者仍可能变异的任何内容. (5认同)
  • 您必须保持对该数组的所有引用内部.您可以允许检索单个元素而无需返回整个数组,或者您可以使用OO方法编程,方法是放置需要访问此类本身内部数组的代码,使其既可以是不可变的也可以是OO. (2认同)

Viv*_*ath 6

关于不变性规则的两分钱(我从阅读有效Java中保留了这一规定 - 一本好书!):

  1. 不提供可以修改对象状态的方法.
  2. 让你所有的领域最终.
  3. 确保您的课程不可扩展.
  4. 将所有字段设为私有.
  5. 提供对可以更改的班级的任何字段或组件的独占访问权限.基本上这适用于您的情况(由JaredPar解释).使用您的类的人仍然可以引用您的数组.相反的情况是您返回类的组件的引用.在这种情况下,始终创建防御性副本.在您的情况下,您不应该分配参考.而是将您的类用户提供的数组复制到内部组件中.