Java – Achtung Falle: Boolean parsen

Heute musste ich aus einem XML-File eine Boolean-Konfiguration laden. Das habe ich nicht das erst mal gemacht, aber es ist auch nichts, was ich täglich mache:

Element node = element.getChild("Editor");
String str = node.getAttributeValue("Overwrite"); 
// str hat "true"
m_settings = new EditorSettings(Boolean.getBoolean(str));

Bitte einfach mal den Code auf sich wirken lassen…

Wenn man sich Boolean.getBoolean(str); anschaut, sieht es doch logisch aus? Ich will den String bitte als Boolean konvertiert haben! Zurück kommt aber (in meinem Fall) immer False, obwohl der String eindeutig „true“ lautet? Was ist los?

Dokumentation nötig?

Also gut, muss ich halt die Java API Dokumentation bemühen, Boolean.getBoolean sagt:

Returns true if and only if the system property named by the argument exists and is equal to the string "true".

If there is no property with the specified name, or if the specified name is empty or null, then false is returned.

Die Funktion sagt mir ob ein System-Property existiert? Was zum Jupiter hat eine System-Property-Funktion in einer Basis-Datentyp-Klasse verloren? Und wenn sie da schon drin ist, warum wird sie nicht eindeutiger benannt… z.B. Boolean.isSystemProperty(String key) o.ä.?

Aber richtiger wäre es doch diese Funktion in die Klasse SystemProperty zu packen? Egal, auch SUN-Mitarbeiter sind nur Menschen. 😉

Schlechte Schnittstellen

Der Witz ist, das ich nicht das erste Mal die letzten 15 Java-Jahre einen String zu einem Boolean konvertieren bzw. parsen wollte. Und ich hatte immer die richtige Funktion gewählt. Aber dieses Mal habe ich die falsche Funktion gewählt, die mir durch die Code-Completion als erstes vorgeschlagen wurde (nicht schlimm) und mir auch vom Namen schlüssig erschien (das ist schlimm). Die Namensgebung und der Ort zwingen einen dazu, erstmal die API-Dokumentation zu lesen, um zu verstehen, was diese überhaupt prinzipiell macht. Und das ist schlechtes API-Design.

Lösung

Danach habe ich natürlich meinen Fehler durch parseBoolean korrigiert. Dabei gibt es zwei Möglichkeiten dieses zu tun:

boolean b1 = Boolean.parseBoolean("true");
Boolean b2 = Boolean.valueOf("true");

Die Klasse Boolean mit ihrer Funktion getBoolean zeigt sehr schön, wie man es nicht machen sollte. Am falschen Ort mit falscher Bezeichnung.