我正在实现一个不可变的类,其结构如下:

public final class A{
    private final B bOb;
    public A(){
        bOb = new B();
    }
    public A(A a){
        bOb = new B(a.bOb);
    }
    public A addData(Type data){ // Type - Integer,String,char,etc.
        A newA = new A(this); //making a copy of the object that is calling addData method
        newA.bOb.add(data);
        return newA;
    }
}

这个实现正确吗?假设对象 bOb 是一个列表。

最佳答案

它不是完全不可变的,因为 B 本身似乎是可变的(通过 add 方法)并且 A 包含 B 的一个实例。

但是,我认为它实际上是不可变的(即,从外部观察者的角度来看,它的行为好像是不可变的),前提是以下所有内容都是正确的:

  • new B(B) 执行 B 的完整深拷贝(如果没有,那么 addData 可能会改变原始 B 中的某些内容)
  • 你没有通过任何其他方式泄露对 bOb 的引用
  • 自己添加的元素是不可变的

  • 你从有效的不可变中获得了不变性的大部分好处,所以我认为这种设计是可以的,只要 Type 是不可变的 - 在构造过程中改变对象是可以的,前提是在你将引用传递给其他人后它永远不会被改变。这方面的一个很好的例子是 java.lang.String - 在内部它包含一个可变数组,该数组在构造 String 时写入,但在此之后不会更改。

    关于java - 这个java类是不可变的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12088869/

    10-13 06:49