Как да предотвратите промени в променлив обект в неизменен обект

Може ли някой да каже как можем да попречим на потребител да променя стойностите на променлив обект, дефиниран в неизменен клас?

Пример: Имаме неизменен Student клас, който съдържа крайна препратка на Address клас, който е променлив. Искам да попреча на потребителя да прави промени в Address клас?


person Ashish Panery    schedule 29.07.2015    source източник
comment
Осигурявате инициализация на конструктора за адресен клас, запазвайки всички негови членове частни и без никакви настройки   -  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