您应该创建可变实例的防御性副本: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,那么其他人将无法更改其状态。