Ich versuche, etwas in die Definition von "Unveränderlichkeit" zu integrieren.
Punkt (3) hier sagt, als eine der Regeln zum Erstellen unveränderliche Objekte,
Erlaube den Unterklassen nicht, Methoden zu überschreiben. Der einfachste Weg, dies zu tun ist die Klasse als endgültig zu deklarieren. ...
Überschriebene Methoden werden in Instanzen von Unterklassen ausgeführt. Und von dem, was ich weiß, ist eine unveränderliche Klasse eine, von der die Objekte in den Speicher "geschnitzt" werden, sobald sie instanziiert sind-- Keines seiner Mitglieder und somit das Objekt kann nicht verändert werden.
Setzt man diese zusammen - gilt die Definition von "unveränderlich" sowohl für Klassen als auch für die Objekte? Indem ich die Methoden abschließe, verhindere ich, dass ihre Methoden überschrieben werden, wenn die Klasse erweitert wird. Ich sehe nicht, wie die Methoden einer unveränderlichen Klasse weiter vervollständigt werden, um ihre Objekte unveränderlich zu machen.
Wenn Sie Ihre Klasse als unveränderlich dokumentieren, können Benutzer dieser Klasse sicher davon ausgehen, dass jede Instanz dieser Klasse unveränderlich ist.
Das Problem besteht darin, dass es nichts verbietet, wenn eine Unterklasse Ihrer Klasse unterklassifiziert wird, einer untergeordneten Klasse änderbare Zustände und Methoden hinzuzufügen oder sogar Methoden zu überschreiben und sie dazu zu bringen, diesen neuen Status zu mutieren. Die Annahme der Benutzer der Klasse fällt also auseinander. Den Abschluss der Klasse zu machen, macht das unmöglich.
Ich sehe nicht, wie die Finalisierung der Methoden einer unveränderlichen Klasse ihre Objekte unveränderlich macht.
Wenn eine Klasse final
ist, ist ihre Methode final
redundant; Da nichts von der Klasse abgeleitet werden kann, kann nichts die Methoden außer Kraft setzen, unabhängig davon, ob sie als final
deklariert sind oder nicht. Vorausgesetzt, die Klasse, die Sie definiert haben, ist unveränderlich, wenn es final
ist, kann es keine Unterklassen geben, die nicht unveränderbar sind (weil es überhaupt keine Unterklassen geben kann).
Ich nehme an, wenn die Objekte einer Klasse unveränderlich sind, dann können Sie sagen, dass die Klasse auch unveränderlich ist. String
-Objekte sind unveränderlich, daher könnte man sagen, dass die String
-Klasse unveränderlich ist.
Wenn Sie Ihre Methoden final
erstellen, verhindern Sie, dass eine unbekannte Unterklasse Folgendes tut:
Es verhindert, dass eine Unterklasse Vererbung und Polymorphie verwendet, um die Daten in Ihrer Klasse zu mutieren (ändern). Es verhindert auch, dass eine Unterklasse einen eigenen Zustand einführt, der veränderbar sein könnte.
Unveränderlichkeit ist nicht etwas, das man einfach erklären kann; Sie müssen es mit mehreren Techniken erzwingen, die in die Java-Sprache integriert sind. Machen Sie Ihre Methoden final
ist einer von ihnen.
gilt die Definition von "unveränderlich" sowohl für Klassen als auch für die Objekte?
Sehen Sie, wie ein class
der Bauplan eines Objekts ist, ja?
Der wichtigere Unterschied, der hier gemacht werden muss, ist folgender: - Wenn Sie final
überall hinzufügen, wird Ihre Klasse / Ihr Objekt NICHT unveränderlich gemacht. überhaupt.
Bedenken Sie Folgendes:
%Vor%Unveränderlich bedeutet, dass sich das Objekt NICHT ändern kann. Das Standard-String-Objekt in Java ist also unveränderlich - Sie können es übergeben, Sie können beliebig viele Referenzen speichern, aber Sie können es nicht ändern. Wenn Sie eine Zeichenfolge ändern möchten, verwenden Sie einen StringBuilder (oder StringBuffer), um sie anzufügen oder zu ändern.
Aber String ist eine vom System bereitgestellte Klasse, so dass ihre Unveränderbarkeit als bare Münze angenommen werden kann. Wenn Sie eine unveränderbare Klasse erstellen möchten, können Sie dies nur tun, indem Sie nur Methoden bereitstellen, die garantiert den internen Status nicht ändern. Da eine Klasse normalerweise überschrieben werden kann, ist es denkbar, dass ein Codeabschnitt die Klasse unterklassifiziert, nur um den internen Status zu ändern.
Daher:
Unveränderlichkeit ist eine gute Eigenschaft für Objekte (insbesondere solche, bei denen das Eigentum ein Problem sein kann oder Nebenläufigkeit ist), aber der Nachteil ist, dass Sie viele Wegwerfobjekte konstruieren können und daher ineffizient sein können. Es ist also ein Kompromiss und es hängt davon ab, was Sie für die Objekte benötigen, ob es sich lohnt.
Es gibt wesentliche Unterschiede in der Appliance des Schlüsselworts final
.
Gerät ...
Dokumente:
Objekte definieren Verhalten und Zustand. Unveränderlichkeit bezieht sich auf ein Objekt, das nach seiner Erstellung seinen internen Zustand nicht ändert.
das macht es einfacher mit Threads zu arbeiten, neben anderen Vorteilen, hier ist ein Beispiel aus der Guave einer unveränderlichen Liste. Ich kann seit dem im neuen Jahr keine Links mehr posten ... Ссылка .com /svn/trunk/javadoc/com/google/common/collect/ImmutableList.html
Um Ihre Frage zu beantworten, begrenzt das Finalisieren von Methoden die Vererbung, aber nicht die Unveränderbarkeit.
Tags und Links java immutability