2015-07-29 4 views
0

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

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

+0

Вы обеспечиваете инициализации конструктора для адресов класса, сохраняя все члены ней приватным и без сеттеров –

+0

Не будет ли это сделать 'Address' класс эффективно неизменны? – Clashsoft

+0

Возможный дубликат [Restriting измененный объект внутри неизменяемого объекта Java] (http://stackoverflow.com/questions/27189235/restrict-mutable-object-inside-immutable-object-java) –

ответ

1

Упорядочить по 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. Это намного сложнее, но может помочь, когда у вас нет доступа к источникам.

0
public final class Employee{ 
    private final int id; 
    private final Address address; 
    public Employee(int id, Address address) 
    { 
     this.id = id; 
     this.address=new Address(); // defensive copy 
     this.address.setStreet(address.getStreet()); 
    } 
    pulbic int getId(){ 
     return id; 
    } 
    public Address getAddress() { 
     Address nuAdd = new Address(); // must copy here too 
     nuAdd.setStreet(address.getStreet()); 
     return nuAdd; 
} 

How can we maintain Immutability of a class with a mutable referrence

Смежные вопросы