Es ist eine Überlegung wert, die unveränderlich zwei Dinge bedeuten:
a) Du, dass dieser Wert Somwhere gibt es nicht mutiert werden kann.
b) „a“ und dass es sicher in Multithread-Umgebung verwendet werden kann
ad A) Es Klassen sind, die nur unveränderlich sind aber nicht Thread sicher, sie sind gut mit Setter/Getter verwendet werden und Schlüssel in HashMap sein - diese ohne Mutatoren, mit allen Feldern privat, aber ohne alle Felder final oder volatile.
ad B) Es gibt Klassen, die unveränderlich und Thread-sicher sind - diese ohne Mutatoren und mit allen Feldern privat und endgültig oder flüchtig.
Klassen, die threadsicher sind, werden oft so in der Dokumentation oder sogar beim Namen beschrieben, natürlich können einige Klassen unveränderlich und/oder threadsicher sein, aber nicht streng dokumentiert. Zum Beispiel ist die String
Klasse als "konstant" dokumentiert, aber es gibt keine Informationen über Thread-Sicherheit - es gibt nur eine rätselhafte Aussage "Da String-Objekte unveränderlich sind, können sie geteilt werden", aber ich denke, es bedeutet etwas anderes als ... mit anderen Threads geteilt. Wir kennen nur die Eigenschaften beliebter Klassen, aber ich stimme zu, dass diese Eigenschaften eindeutig dokumentiert werden sollten. Leider sind sie im wirklichen Leben nicht. Die einzige Möglichkeit zu wissen, ob die Klasse unveränderbar ist, besteht darin, die Dokumentation zu überprüfen und, wenn nicht genügend Informationen vorhanden sind, die Implementierung zu überprüfen und den Autor zu fragen, ob Er plant, die Klasse in der Zukunft veränderbar zu machen. Dieses Thema wird in einem Buch Java Concurrency in Practice behandelt, und der Autor schlägt vor, zwei Anmerkungen zu verwenden, um anzuzeigen, dass etwas @ThreadSafe
und/oder @Immutable
ist, aber unglücklicherweise ist dies noch keine übliche Praxis.
Nun, keine dieser Klassen hat Mutatoren ... im Gegensatz zu 'String.concat()' könnten Sie sich vorstellen, dass es die 'Zeichenkette' modifiziert anstatt die neue verkettete. – Kayaman
"Vom Entwickler wird erwartet, dass er die Implementierung liest" Nein, das sollte niemals erwartet werden. Aber Sie können es aus der * Dokumentation * ableiten (wie in, es ist 'final', und es gibt keine Setter). –
@AndyTurner Hängt davon ab, was Sie mit unveränderlich meinen. Unveränderbarkeit wird oft im Zusammenhang mit Thread-Sicherheit diskutiert, die von Implementierungsdetails, wie etwa "endgültigen" Feldern, abhängt. – shmosel