2017-08-24 1 views
3

Es ist bekannt, dass die Typ-Wrapper wie Integer, Double, unveränderlich sind. Allerdings konnte ich dies in der offiziellen API-Dokumentation, z. B. https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html, nicht finden. Ich schaute auch in den Quellcode-Dateien und tat nicht finden Sie dies in den Kommentaren angegeben. (Die Kommentare in dem Quellcode für String, auf der anderen Seite, haben seine Unveränderlichkeit erwähnen.)Dokumentation der Unveränderlichkeit von Java-Wrapper-Klassen

Ist das, weil:
- es an anderer Stelle dokumentiert ist (wenn ja, wo?),
- diese Tatsache ist auch "wohl bekannt", oder
- der Entwickler wird erwartet, die Implementierung der Wrapper zu lesen und herauszufinden, ob der Wrapper unveränderlich ist oder nicht?

+0

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

+5

"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). –

+1

@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

Antwort

0

Die verpackten Wrapper sind "unveränderlich", weil sie virtuell syntaktisch mit den literalen Typen, die sie umhüllen, austauschbar sind. Zum Beispiel boolean ist unveränderlich:

boolean x = false; 
x.flip(); // not implemented 

Einheimische Arten in den meisten Programmiersprachen sind unveränderlich. Daher ist

auch nicht definiert.

1

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.

Verwandte Themen