[英]How to maintain Immutable nature of a class referencing Mutable Objects?
我很清楚使类不可变的规则。 但是考虑一下这样的情况:我的A类组成B类。B类在外部jar中,而B类再次组成C和D,即
class A{
B b;
}
// External library
class B{
C c;
D d;
}
class C{
}
class D{
}
如果无法在外部库中修改类,如何使A类不可变? 如果外部库中的类是可修改的,那么我可以实现可克隆的,但这是不可能的,因为我无法修改它们。
您应该创建可变实例的防御性副本:
class A {
private final B b;
public A(B b) {
// Create a defensive copy of b
this.b = new B(b);
}
}
如果B
没有提供这样的复制构造函数,则您将需要自己为B
实现防御性复制。
如果你不这样做,我可以通过实例B
到A
,而且还保持该实例B
对自己和我自己的意愿,后来发生变异它。
A类不应允许访问任何可变引用。
这是您的班级示例的样子:
class A {
private final B b;
public A(B b) {
this.b = b;
}
// no public access to B reference that's final. No changing it from the outside. A is immutable.
}
类B,C和D来自库。 如果给A一个可变的引用并允许其余代码更改B或其C和D子代的状态,则无需执行任何操作。 但是,如果您正确构造B并将其委托给A,那么其他人将无法更改其状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.