java - 如何防止不可变对象(immutable对象)中的可变对象发生更改

标签 java immutability

有人能告诉我们如何阻止用户修改不可变类中定义的可变对象的值吗?

示例: 我们有一个不可变的 Student 类,其中包含可变的 Address 类的最终引用。我想阻止用户在 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 中。这要复杂得多,但在您无法访问源代码时会有所帮助。

关于java - 如何防止不可变对象(immutable对象)中的可变对象发生更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31697457/

相关文章:

java - 正则表达式删除除特定标记之外的控制字符

java - Android Studio应用程序中Gradle构建中的重复类

java - 如何暂停线程执行

C# 和不可变性和只读字段……谎言?

javascript - 了解以下情况下的不变性和虚拟 DOM

javascript - Array.map() 的函数式编程

Java 运算符 : |= bitwise OR and assign example

java - 在Java中将数据写入excel第一个选项卡数据在写入第二个选项卡时不显示

javascript - TypeScript 中的不可变数据

java - TreeMap 的不可修改 View 是否保留键顺序?