2016-06-19 6 views
8

Der folgende Code für Integer verwendet Objekt Internierung:Ist der Boolean in Java interniert?

Es ist nicht klar von API-Dokumentation, ob dieser Code für Boolean verwendet auch internierten Objekt:

Boolean.valueOf("true") 

Offensichtlich es kann. Aber muss es?

UPDATE

Ich bin damit einverstanden, dass Quellcode erklären kann, was tatsächlich geschieht (BTW, danke für die Antworten). Um die Frage weniger trivial zu machen, gibt es einen Teil der Java-API-Spezifikation oder JSL, der sagt, was MUSS passieren?

Es war natürlich die Frage gegen den Code wie folgt zu stellen:

String str = "true"; 
if (Boolean.valueOf(str) == Boolean.TRUE) { ... } 

Das Ergebnis hängt davon ab, ob „Objekt Internierung“ gewährleistet ist oder nicht. Es ist besser, diesen Code ganz zu vermeiden und true anstelle von Boolean.TRUE zu verwenden (anstatt Details in irgendwelchen specs oder Quellen nachzuschlagen), aber es ist ein gültiger Grund, die Frage zu stellen.

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

+4

Sie können selbst überprüfen, indem Sie den Quellcode –

+0

überprüfen Sie können auch überprüfen, indem Sie zweimal aufrufen und überprüfen, ob Sie die gleiche boolesche Instanz zweimal oder nicht erhalten. Warum kümmert es dich überhaupt? Dies sollte nichts an Ihrem Code ändern. –

+0

@a_horse_with_no_name, ** ist Objekt interning außerhalb der Spezifikation? ** Source-weise ich denke, es gibt das Objekt 'Boolean.TRUE' (oder' Boolean.FALSE' für '" false "'). Bei einem so kleinen Wert (nur 2) reichen diese Konstanten aus, um den Pool zu modellieren. Aber ist es durch die Spezifikation diktiert? – uvsmtid

Antwort

5

Die JLS garantiert, dass:

Integer i = 1; 
Boolean b = true; 

wird (zumindest zwischen -128 und 127 für Integers und für wahr und falsch für Boolesche Werte) verwenden Internierung.

Die relevanten javadocs garantieren auch, dass:

Integer i = Integer.valueOf(1); 
Boolean b = Boolean.valueOf(true); 

interniert Objekte zurück.

Jedoch 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)) wäre gültig.

5

Basierend auf dem source code wird der boolean wie analysiert:

public static final Boolean FALSE = new Boolean(false); 
public static final Boolean TRUE = new Boolean(true); 

public static Boolean valueOf(String s) { 
    return toBoolean(s) ? TRUE : FALSE; 
} 

Wo TRUE und FALSE statisch (unveränderlich) Objekte sind. Also ja, geparste Booleans sind interniert.

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

2

Hier ist der source code:

public static Boolean valueOf(String s) { 
    return parseBoolean(s) ? TRUE : FALSE; 
} 

Wo TRUE ist:

public static final Boolean TRUE = new Boolean(true); 

Wenn Sie noch nicht sicher sind, definieren zwei Variablen:

Boolean a = Boolean.valueOf("true"); 
Boolean b = Boolean.valueOf("true"); 

und prüfen Sie, was Sie wollen allein.