[JAVA] Null- / Leerzeichenbeurteilung mit Optional 2.0

Wenn ich die if-Anweisung verwende, dachte ich schließlich, es wäre besser, Optional überhaupt nicht zu verwenden. Ich möchte die Beurteilung von Null- / Leerzeichen mit Optional weiterentwickeln.

Sofern nicht anders angegeben, wird davon ausgegangen, dass es mit Java 1.8 oder höher funktioniert.

Auslösen

Kürzlich habe ich so etwas in dem Code gefunden, der eine "Existenzprüfung" der Zeichenkette durchführt, und es hat mich ziemlich unwohl gefühlt: Denken:

String uri = SystemPropertiesUtil.getPropertyOptional(Constant.URI).orElse("");

if (StringUtils.isEmpty(dkInfoGetApiUrl)) {
//Wenn es null ist, werde ich etwas tun
}

In dieser Szene erhalten Sie den API-URI aus der Datenbank und verwenden ihn für den API-Aufruf. getPropertyOptional ist eine Methode, die Optional zurückgibt. Außerdem ist "StringUtils # isEmpty", das in der if-Anweisung angezeigt wird, eine vom Spring Framework bereitgestellte Dienstprogrammmethode.

In diesem Fall können Sie nur Null- / Leerzeichen normal beurteilen, und es ist ziemlich einfach, Optional nicht zu verwenden.

Dieses Beispiel ist etwas extrem, aber wir werden prüfen, ob es möglich ist, die Benutzerfreundlichkeit und Sicherheit zu verbessern, indem Optional für das allgemeine "Nicht-Null-Nicht-Leerzeichen" verwendet wird.

Die Art der optionalen

Optional ist laut Javadoc

Ein Containerobjekt, das Werte ungleich Null enthalten kann oder nicht.

Es heißt (Optional (Java Platform SE 8)).

Wenn es beim Umschließen mit "Optional # ofNullabele" nicht null erscheint, kann der Wert unverändert abgerufen werden, andernfalls kann er separat verarbeitet werden. Mit anderen Worten, es gibt nicht viel Grund, ein leeres Zeichen zurückzugeben.

Wenn Sie jedoch überprüfen möchten, ob die String-Instanz nicht null und kein leeres Zeichen ist, denken Sie daran, dass beim Initialisieren mit "Optional # ofNullable" das Kontrollkästchen "Leerzeichen" deaktiviert ist.

Lösung

Im Allgemeinen bei der Beurteilung eines leeren Zeichens

Ich denke, dass es viele Fälle gibt, in denen es nach einer statischen Methode beurteilt wird, die einen Booleschen Wert zurückgibt. Zum Beispiel

StringUtil.java


public static boolean isNullOrEmpty(String string) {
    if (string == null || string.equals("")) return true;

    return false;
}

Kann es wie folgt ersetzt werden? Wenn Sie bestätigen möchten, dass die erwartete Zeichenfolge in Optional enthalten ist, fügen Sie den allgemeinen "StringUtils" die folgende Methode hinzu.

StringUtil.java


public static Optional<String> ofPresentable(String string) {
    if (string == null || string.equals("")) return Optional.empty();

    return Optional.of(string);
}

2020-11-17: Nachtrag Ich bin froh, dass ich in dem Kommentar eine andere Idee habe, also habe ich sie hinzugefügt.

StringUtil.java


public static Optional<String> ofPresentable(String string) {
    return Optional.ofNullable(string).filter(s -> !s.isEmpty());
    //IsBlank kann mit Java 11 oder höher verwendet werden
    // return Optional.ofNullable(string).filter(String::isBlank);
}

Durch Umschließen des Rückgabewerts mit Optional kann die Möglichkeit angegeben werden, dass der Wert nicht vorhanden ist. Deshalb bis jetzt

SomeObject object = new SomeObject();
if(id == null || id.equals("")) {
    object.setId("default");
} else {
    object.setId(id);
}

Wo ich war

final String idPresentable = StringUtil.ofPresentable(id).orElse("default");
SomeObject object = new SomeObject(idPresentable);

Kann gemacht werden. Um ehrlich zu sein, gibt es keinen großen Unterschied in Ihrer Arbeit. Durch Eliminieren der Steuerungssyntax können Sie jedoch weniger auf Statusänderungen achten und das Verfolgen und Ändern erleichtern. Da die Möglichkeit, null zu werden, angegeben werden kann, ist es außerdem möglich, einen unerwarteten Fehler zu verhindern, indem eine beliebige Laufzeitausnahme ausgelöst wird, bei der die Logik nicht null sein kann.

Mit anderen Worten

final String idPresentable = StringUtil.ofPresentable(id).orElseThrow(new RuntimeException("Unerwartete Eingabe"));
SomeObject object = new SomeObject(idPresentable);

Es ist keine 100% ige Alternative und möglicherweise für einige Anwendungsfälle nicht geeignet. Ich bin jedoch der Meinung, dass dieses Muster in einigen Fällen effektiver ist, und ich würde es auf jeden Fall gerne in Zukunft ausprobieren.

Bonus

Dieses Mal hatte ich ein starkes Problem bei der Verarbeitung von Zeichenketten, aber durch die Vorbereitung ähnlicher Methoden für List und Map scheint es, dass die Beurteilung und Verarbeitung der Elementexistenz in einigen Fällen einfach und sicher erfolgen kann.

Zum Beispiel

ListUtil.java


public static <T> Optional<List<T>> ofPresentable(List<T> list) {
    if (list == null || list.size() == 0) return Optional.empty();

    return Optional.of(list);
}

Wenn Sie es reich machen möchten, können Sie auch bestimmen, ob das Listenelement null enthält.

Recommended Posts

Null- / Leerzeichenbeurteilung mit Optional 2.0
Null, leere Zeichen, Leerzeichen
Unterschied zwischen Element 0, Null und leerem Zeichen (Check-in-Liste)
StringUtils.isNotBlank eignet sich für Leerurteile und Nullurteile in Java