Ich möchte nicht die tiefe Kopie machen.Wie kann man ein veränderbares Objekt sicher veröffentlichen?
Angenommen, ich habe ein Feld eines veränderlichen Typs, eine x, y, z Koordinate zum Beispiel. Gelegentlich muss ich dieses Feld einigen Zuschauern zugänglich machen. Und ich möchte, dass es schreibgeschützt ist. Ich erinnere mich, dass ich so etwas wie einen Wrapper gelesen habe, um diese Art von Sachen zu machen, aber ich erinnere mich nicht an die Details.
Das x, y, z-Koordinatenbeispiel ist möglicherweise zu einfach, weil x, y, z primitiver Typ sind. Also gibt getX() immer eine Kopie zurück.
Ich möchte eine allgemeine Lösung, auch wenn die x, y, z Felder von einem anderen veränderlichen Typ sind.
Kann jemand helfen?
EDIT:
public class Client
{
public static final Holder holder = new Holder();
public static void main(String[] args)
{
UserWrapper user = holder.getUser();
System.out.println(user); //UserWrapper{user=User{address=Address{street='street 101'}}}
user.getAddress().setStreet("mars"); //UserWrapper{user=User{address=Address{street='mars'}}}
System.out.println(user);
}
}
public class Holder
{
private User user;
public Holder()
{
user = new User();
Address address = new Address();
address.setStreet("street 101");
user.setAddress(address);
}
public UserWrapper getUser()
{
return new UserWrapper(user);
}
}
public class User
{
private Address address;
public Address getAddress()
{
return address;
}
public void setAddress(Address address)
{
this.address = address;
}
}
public class UserWrapper
{
private User user;
public UserWrapper(User user)
{
this.user = user;
}
public Address getAddress()
{
return user.getAddress();
}
}
EDIT: Kredit I don't know who
(er löscht die Antwort), finde ich this link er in seinem ursprünglichen Beitrag erwähnt sehr hilfreich.
Was meinen Sie durch die * tiefe Kopie Art und Weise *? – jrook
OK, also schreibe einen schreibgeschützten Wrapper darum herum. Was ist deine Frage? – azurefrog
@azurefrog Angenommen, das besagte Feld ist ein 'User'-Objekt. Ich kann einen schreibgeschützten Wrapper um 'User' schreiben, der die Setter versteckt, so dass der Client 'getUserWrapper() nicht aufrufen kann. SetAddress()'; Aber sie können immer noch 'getUserWrapper() aufrufen. GetAddress(). SetStreet()'; Das ist, was ich meine. – du369