Ist ein Boolean in Java interniert?

8

Der folgende Code für Integer verwendet das Objekt interning:

%Vor%

Aus der API-Dokumentation geht nicht eindeutig hervor, ob dieser Code für Boolean verwendet auch internes Objekt:

%Vor%

Offensichtlich kann es. Aber muss es?

AKTUALISIEREN

Ich stimme zu, dass der Quellcode erklären kann, was tatsächlich passiert (Übrigens, danke für die Antworten). Um die Frage weniger trivial zu machen, gibt es einen Teil der Java-API-Spezifikation oder JSL, der was MUSS passiert?

Es war natürlich, die Frage so gegen den Code zu stellen:

%Vor%

Das Ergebnis hängt davon ab, ob "Object Interning" garantiert ist oder nicht. Es ist besser, diesen Code vollständig zu vermeiden und true anstelle von Boolean.TRUE zu verwenden (anstatt Details in irgendwelchen Spezifikationen oder Quellen nachzuschlagen), aber es ist ein berechtigter Grund, die Frage zu stellen.

HINWEIS: In der Tat habe ich keine Garantien für das Objekt-Interning für Integer in den googled-Spezifikationen gesehen. Es kann also nur ein Implementierungsdetail sein, auf das sich niemand verlassen sollte.

    
uvsmtid 19.06.2016, 08:58
quelle

3 Antworten

5

Die JLS garantiert, dass:

%Vor%

verwendet Interning (mindestens zwischen -128 und 127 für Integer und für True und False für Booleans).

Die relevanten Javadocs garantieren auch, dass:

%Vor%

gibt internierte Objekte zurück.

Allerdings gibt es keine expliziten Garantien für valueOf(String) : Obwohl dies in der spezifischen Implementierung der Fall ist, die Sie verwenden, ist dies bei einer anderen JVM oder in zukünftigen Versionen möglicherweise nicht der Fall. In der Tat wäre eine Implementierung, die return new Boolean(Boolean.parseBoolean(input)) gültig wäre.

    
assylias 20.06.2016, 09:53
quelle
5

Basiert auf dem Quellcode , wird der Boolesche Wert wie folgt analysiert:

%Vor%

Dabei sind TRUE und FALSE statische (unveränderliche) Objekte. Also ja, geparste Booleans sind interniert.

Allerdings stimme ich @ JBNizets Kommentar zu, dass man sollte Code-Verträge nicht aus dem Quellcode ableiten: Solange ein Feature nicht dokumentiert ist, können die Entwickler von Java ihre Meinung ändern. Verwenden Sie besser Boolean.equals , um zu prüfen, ob zwei Objekte gleichwertig sind.

    
Willem Van Onsem 19.06.2016 09:04
quelle
2

Hier ist die Quellcode :

%Vor%

Wo TRUE ist:

%Vor%

Wenn Sie immer noch nicht sicher sind, definieren Sie zwei Variablen:

%Vor%

und überprüfen Sie, was Sie selbst wollen.

    
Maroun 19.06.2016 09:05
quelle

Tags und Links