为了账号安全,请及时绑定邮箱和手机立即绑定

如何维护引用可变对象的类的不可变性质?

如何维护引用可变对象的类的不可变性质?

撒科打诨 2021-05-15 14:08:19
我很清楚使类成为不可变的规则。但是考虑一下这样的情况:我的A类组成B类。B类在外部jar中,而B类再次组成C和D,即class A{  B b;}// External libraryclass B{  C c;  D d;}class C{}class D{}如果无法在外部库中修改类,如何使类A不可变?如果外部库中的类是可修改的,则本可以实现可克隆的,但这是不可能的,因为我无法对其进行修改。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您应该创建可变实例的防御性副本:


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给我自己,并在以后根据自己的意愿对其进行变异。


查看完整回答
反对 回复 2021-05-19
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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,那么其他人将无法更改其状态。


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信