Java 如何防止不可变对象中的可变对象发生更改

Java 如何防止不可变对象中的可变对象发生更改,java,immutability,Java,Immutability,有人能告诉我们如何防止用户修改在不可变类中定义的可变对象的值吗 例如: 我们有一个不可变的Student类,它包含Address类的最终引用,它是可变的。我想防止用户对地址类进行任何更改?将地址设置为接口。将您的可变MutableAddress设置为正常,并设置一个ImmutableAddress,将其包装起来,以防止对字段的写入访问 interface Address { public String getNumber(); public void setNumber(St

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

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

地址
设置为
接口
。将您的可变
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.");
    }

}

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

您为Address类提供构造函数初始化,使其所有成员保持私有且没有任何setter。这难道不会使
Address
类有效地不可变吗?可能重复@DonRoby:谢谢。!!我知道答案了。