This question already has answers here:
Immutable class?
                                
                                    (9个答案)
                                
                        
                                2年前关闭。
            
                    
public class A {
    private int[] values;

    public int[] getValues() {
        return values;
    }
}


我正在读的书说它不是一成不变的,因为值是一种引用类型。除了在类内部创建main方法之外,我看不到任何其他方法来更改值。

最佳答案

这是可变的,因为您可以通过公开的方法更改values的内容

A obj = new A(...) // values gets filled here
int[] leak = obj.getValues()
leak[0] = 42


这意味着您的values属性现在包含已在外部修改的信息。要使其不可变,您应该返回该数组的副本,以确保没有外部代理可以对其进行修改,并且应将其定型为最终状态,以便不能创建任何可以暴露状态并使它再次可变的子类。 :

public final class A {
  private int[] values;

  public int[] getValues() {
    return Arrays.copyOf(values);
  }
}

关于java - 为什么将此类视为易变的? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45969534/

10-09 20:02