Ich habe Effektives Java gelesen und bin auf die Aussage gestoßen, dass Sie nicht nur unveränderliche Objekte teilen können, sondern auch ihre Interna teilen können. Aber ich kämpfe um herauszufinden, was das wirklich bedeutet, und ein Beispiel würde sicherlich helfen, da in dem Buch kein Beispiel gegeben ist. Ich weiß bereits, dass unveränderliche Objekte nicht geändert werden können, z. B. String
.
Lesen Sie Buch weiter:
Die
BigInteger
-Klasse verwendet intern eine Vorzeichen-Magnituden-Darstellung. Das Vorzeichen wird durchint
dargestellt und die Größe wird durch einint
-Array dargestellt. Dienegate
-Methode erzeugt eine neueBigInteger
gleicher Größe und entgegengesetzten Vorzeichens. Das Array muss nicht kopiert werden. Das neu erstellteBigInteger
zeigt auf dasselbe interne Array wie das Original.
Zum Beispiel, wenn Sie eine Klasse haben
%Vor% Dann sind a
und b
die "Interna" dieser Klasse. Da dies eine Instanz von BigDecimal
ist, sind sie unveränderlich. Wenn Sie eine Operation wie setBToZero()
implementieren, können Sie einfach Ihre Instanz von a
wiederverwenden und müssen keine neue erstellen. Zum Beispiel
Sie teilen Ihr internes a
und da es unveränderlich ist, müssen Sie sich keine Gedanken über Änderungen Ihres gemeinsamen Status machen. Dies ist besonders nützlich, wenn es sich um große Objekte handelt. Wenn Sie Schnittstellen verwenden, können Sie einige Operationen nur mithilfe von Proxyobjekten implementieren.
Ich denke, was sie wirklich sagen ist, dass normalerweise mit veränderbaren Objekten auf Felder mit Getter- und Setter-Methoden zugegriffen wird und diese modifiziert werden und diese in einer Multithread-Umgebung synchron sind. Mit unveränderlichen Objekten, da diese Felder garantiert immer die gleichen sind, sind Sie vollkommen sicher, indem Sie sie public
machen und sie "freilegen" und "teilen". Was gut ist - der Zugriff auf ein öffentliches Feld kann klarer und effizienter sein als das Aufrufen einer Methode.
Ein Beispiel für das Teilen von Interna unveränderbarer Objekte. Daten sind unveränderlich, sie teilen ihr Byte-Array mit anderen unveränderlichen Dateninstanzen.
%Vor%