【问题标题】:How to prevent changes in a mutable object in immutable object如何防止在不可变对象中更改可变对象
【发布时间】:2019-03-08 09:30:25
【问题描述】:

谁能告诉我们如何防止用户修改在不可变类中定义的可变对象的值?

示例: 我们有一个不可变的Student 类,其中包含Address 类的最终引用,它是可变的。我想阻止用户对Address 类进行任何更改?

【问题讨论】:

  • 您为 Address 类提供构造函数初始化,使其所有成员保持私有且没有任何设置器
  • 这不会使Address 类有效地不可变吗?
  • @DonRoby:谢谢。!!得到了答案。

标签: java immutability


【解决方案1】:

安排Address 成为interface。使您的可变 MutableAddress 正常,并创建一个 ImmutableAddress 来包装它以防止对字段的写访问。

interface Address {

    public String getNumber();

    public void setNumber(String number) throws IllegalAccessException;

    public String getStreet();

    public void setStreet(String street) throws IllegalAccessException;

    public String getZip();

    public void setZip(String zip) throws IllegalAccessException;

}

class MutableAddress implements Address {

    String number;
    String street;
    String zip;

    @Override
    public String getNumber() {
        return number;
    }

    @Override
    public void setNumber(String number) {
        this.number = number;
    }

    @Override
    public String getStreet() {
        return street;
    }

    @Override
    public void setStreet(String street) {
        this.street = street;
    }

    @Override
    public String getZip() {
        return zip;
    }

    @Override
    public void setZip(String zip) {
        this.zip = zip;
    }

}

class ImmutableAddress implements Address {

    private final Address address;

    public ImmutableAddress(Address address) {
        this.address = address;
    }

    @Override
    public String getNumber() {
        return address.getNumber();
    }

    @Override
    public void setNumber(String number) throws IllegalAccessException {
        throw new IllegalAccessException("Cannot write to this field.");
    }

    @Override
    public String getStreet() {
        return address.getStreet();
    }

    @Override
    public void setStreet(String street) throws IllegalAccessException {
        throw new IllegalAccessException("Cannot write to this field.");
    }

    @Override
    public String getZip() {
        return address.getZip();
    }

    @Override
    public void setZip(String zip) throws IllegalAccessException {
        throw new IllegalAccessException("Cannot write to this field.");
    }

}

或者,将其包装在 Proxy 中。这要复杂得多,但在您无法访问源代码时会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多