Как предотвратить изменения изменяемого объекта в неизменном объекте

Кто-нибудь может сказать, как мы можем запретить пользователю изменять значения изменяемого объекта, определяемого в неизменяемом классе?

Пример: у нас есть неизменяемый класс Student, который содержит последнюю ссылку класса Address, который является изменяемым. Я хочу запретить пользователю вносить какие-либо изменения в класс Address?


person Ashish Panery    schedule 29.07.2015    source источник
comment
Вы обеспечиваете инициализацию конструктора для класса Address, сохраняя все его члены закрытыми и без каких-либо сеттеров.   -  person Amit.rk3    schedule 29.07.2015
comment
Разве это не сделало бы класс Address фактически неизменным?   -  person Clashsoft    schedule 29.07.2015
comment
возможный дубликат ограничить изменяемый объект внутри неизменяемого объекта Java   -  person Don Roby    schedule 29.07.2015
comment
@DonRoby: Спасибо!! Получил ответ.   -  person Ashish Panery    schedule 29.07.2015


Ответы (1)


Устройте так, чтобы 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.");
    }

}

Либо заверните его в прокси. . Это намного сложнее, но может помочь, когда у вас нет доступа к исходникам.

person OldCurmudgeon    schedule 29.07.2015