简体   繁体   English

如何防止不可变对象中的可变对象发生变化

[英]How to prevent changes in a mutable object in immutable object

Can anybody tell how we can prevent a user to modify the values of an mutable object define in an immutable class ? 谁能告诉我们如何防止用户修改不可变类中定义的可变对象的值?

Example : We have a immutable Student class, which contains final reference of Address class, which is mutable. 示例:我们有一个不变的Student类,其中包含Address类的最终引用,该类是可变的。 I want to prevent the user to make any change in Address class? 我想防止用户对Address类进行任何更改?

Arrange for Address to be an interface . 安排Address作为interface Make your mutable MutableAddress as normal and make an ImmutableAddress that wraps it preventing write access to the fields. 使您的可变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.");
    }

}

Alternatively, wrap it in a Proxy . 或者,将其包装在Proxy中 This is much more complicated but can help when you do not have access to the sources. 这要复杂得多,但是当您无法访问源时可以提供帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM