gpt4 book ai didi

java - 这个java类是不可变的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:51:30 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com