有人能告诉我们如何阻止用户修改不可变类中定义的可变对象的值吗?
示例:
我们有一个不可变的 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/