(Für die Zwecke dieser Frage, lassen Sie uns, dass man davon ausgehen, ist absichtlich nicht automatisch (un) Boxen, entweder weil ein Pre-Java 1.5-Code zu schreiben, oder weil man das autounboxing fühlt macht es zu einfach NullPointerException
s zu erstellen . Warum sollte man die öffentlichen Konstruktoren für Boolesche und ähnliche unveränderliche Klassen verwenden?
Boolean
Nehmen wir zum Beispiel
Boolean(boolean)
Konstruktor sagt:
Hinweis: Es ist selten angemessen, diesen Konstruktor zu verwenden. Es sei denn, eine neue Instanz erforderlich ist,
valueOf(boolean)
die statische Fabrik ist in der Regel eine bessere Wahl. Es wird wahrscheinlich deutlich bessere Raum und Zeit Leistung erbringen.
Meine Frage ist, warum sollten Sie jemals eine neue Instanz in erster Linie zu bekommen? Es scheint, dass die Dinge einfacher wären, wenn solche Konstruktoren privat wären. Zum Beispiel, wenn sie waren, konnte schreiben Sie dies ohne Gefahr (auch wenn myBoolean
waren null
):
if (myBoolean == Boolean.TRUE)
Es wäre sicher, weil alle wahr Booleans
Verweise auf Boolean.TRUE
sein würde und alle falsch Booleans
würde Referenzen sein zu Boolean.FALSE
. Aber weil die Konstrukteure öffentlich sind, jemand sie verwendet haben, was bedeutet, dass Sie diese stattdessen schreiben:
if (Boolean.TRUE.equals(myBoolean))
aber wo es wirklich schlimm wird, wenn Sie wollen zwei Booleans
für Gleichheit überprüfen. Etwas wie folgt aus:
if (myBooleanA == myBooleanB)
... wird dies:
if (
myBooleanA == myBooleanB ||
(myBooleanA != null && myBooleanA.equals(myBooleanB))
)
UPDATE: Mit der Veröffentlichung von Java 7, macht java.util.Objects dies einfacher konstruieren möglich:
if (Objects.equals(myBooleanA, myBooleanB))
Ich kann mir keinen Grund vorstellen, getrennte Instanzen dieser Objekte zu haben, was zwingender ist, als den obigen Unsinn nicht zu tun. Was sagst du?
Sie haben diesen letzten Codeblock falsch. Entweder 'a == null? b == null: a.equals (b) 'oder' a == b || (a! = null && a.equals (b)) '. Oder 'Objects.eq (a, b)'. –
Sie haben Recht. Ich habe es in 'a == b || geändert (a! = null && a.equals (b)) '. –