2016-03-21 9 views
0

Ich habe die Anforderung nicht verstanden, eine Klasse in Java unveränderlich zu machen. Folgende ist die Forderung, die ich zu verstehen, nicht in der Lage bin:Erstellen einer unveränderlichen Klasse in Java mit veränderbarer Referenz

1) Wenn die Instanzfelder Referenzen auf veränderliche Objekte umfassen, erlauben nicht die Objekte geändert werden:

a) Sie Methoden nicht vorsehen, dass modifiziere die veränderbaren Objekte.

b) Teilen Sie keine Referenzen auf die veränderbaren Objekte. Speichern Sie niemals Verweise auf externe, veränderbare Objekte, die an den Konstruktor übergeben werden. Erstellen Sie ggf. Kopien und speichern Sie Verweise auf die Kopien. Erstellen Sie auf ähnliche Weise Kopien Ihrer internen änderbaren Objekte, um die Rückgabe der Originale in Ihren Methoden zu vermeiden.

Bitte erläutern Sie dieses Konzept mit einem klaren und einfachen Beispiel.

+2

schauen Sie sich einfach die 'String' an. Sie können es nicht direkt ändern, jede Änderung, die an einer Instanz einer 'String' vorgenommen wird, gibt immer eine neue Instanz einer' String' zurück. Sie können eine Instanz eines 'String' nicht ändern, indem Sie nur Methoden dafür aufrufen. – SomeJavaGuy

Antwort

2

Sie bieten Methoden nicht, die die veränderbaren Objekte ändern

Wenn Sie nicht Getter liefern und wenn diese Instanz nicht von einer externen Quelle zu Ihrer Klasse übergeben wurde (in der Regel an den Konstruktor übergeben) , dann hat nur Ihre Klasse Zugriff auf diese zusammengesetzte Instanz.

speichern niemals Verweise auf externe, veränderbare Objekte an den Konstruktor übergeben

In Java sogar Referenzen sind vergangen-by-Wert, so dass, wenn ein Referenztyp an den Konstruktor übergeben wird von In Ihrer Klasse müssen Sie eine Kopie der Instanz erstellen (dh verwenden Sie nicht die Instanz, die übergeben wird, verwenden Sie eine Deep-Kopie der Instanz).

erstellen Sie Kopien Ihrer internen veränderbaren Objekte, wenn nötig, zu vermeiden, die Originale in Ihren Methoden zurückzugeben.

Wenn Sie Referenztypen auf Ihre Anrufer zurückkehren müssen, dann sollten Sie defensive Kopien anstelle von Verweisen auf Original-Instanzen zurück.