Упорядочить по Address
как interface
. Сделайте свой mutable 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. Это намного сложнее, но может помочь, когда у вас нет доступа к источникам.
Вы обеспечиваете инициализации конструктора для адресов класса, сохраняя все члены ней приватным и без сеттеров –
Не будет ли это сделать 'Address' класс эффективно неизменны? – Clashsoft
Возможный дубликат [Restriting измененный объект внутри неизменяемого объекта Java] (http://stackoverflow.com/questions/27189235/restrict-mutable-object-inside-immutable-object-java) –