EN · DE · RU · FR · ES

#752: Status.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java Java-Enum — Einzelwert-Sentinel zur Steuerung der XML-Deserialisierung. 32 Zeilen. Quelle: projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java 32 Zeilen · 5 Code · 25 Kommentare · 2 leer
Zweck: Ein Enum mit einem einzelnen Wert: IGNORE. 32 Zeilen, davon 21 für den GPLv3-Lizenzheader. Eine der kürzesten und ungewöhnlichsten Dateien im Projekt. Der Javadoc zu IGNORE erklärt: "Wird von XmlObjectReader.newInstance(Class, org.dom4j.Element, String) verwendet" — es wird von der Methode newInstance() des XmlObjectReader beim XML-Lesen verwendet.

Warum ein Einzelwert-Enum?

Dies ist das Sentinel-Muster — ein spezieller Wert, der signalisiert, dass ein Element beim Lesen übersprungen werden muss. Wenn XmlObjectReader.newInstance() auf ein XML-Element stößt, für das keine registrierte Klasse existiert (z. B. ein Tag aus einer alten Formatversion, die in einer neueren Version entfernt wurde), gibt es Status.IGNORE zurück, anstatt mit einem Fehler abzustürzen.

Warum nicht einfach null zurückgeben? Weil null mehrdeutig ist: Es könnte "überspringen" ODER "ein Fehler ist aufgetreten" ODER "das Element ist leer" bedeuten. Status.IGNORE ist ein explizites, benanntes Signal: "Ich erkenne dieses Element als ignorierbar an, überspringe es bewusst und fahre mit der Verarbeitung fort."

Drei-Zustands-Auflösung

Das Enum ermöglicht saubere Drei-Zustands-Rückgabewert-Semantiken:

Object result = newInstance(clazz, element, version);
if (result == Status.IGNORE) {
    // Unbekanntes Element, überspringen
} else if (result == null) {
    // Erkannt, aber hat null-Wert (Feld ist leer)
} else {
    // Normales deserialisiertes Objekt
}

Dies ist deutlich sauberer als die Rückgabe von null mit mehrdeutiger Semantik. Das Muster ist in Parsern und Deserialisierern üblich – z. B. verwendet Rust Option<T>, Haskell verwendet Maybe, und hier – ein Einzelelement-Enum.

Verwendungsort

Methode XmlObjectReader.newInstance(Class<?> clazz, Element rootElement, String version) — eine geschützte Factory-Methode, die von Unterklassen überschrieben werden kann. Auf jeder Ebene wird die AliasMap geprüft: Wenn das Tag registriert ist, wird ein Objekt erstellt; wenn nicht registriert – wird Status.IGNORE zurückgegeben, und der aufrufende Code überspringt dieses Element. Dies ermöglicht es XML-Dateien, "zusätzliche" Tags zu enthalten (z. B. aus einer neueren Formatversion, wenn sie von einer älteren Version gelesen werden), ohne Fehler zu verursachen – ein Mechanismus für Abwärtskompatibilität.

Warum Enum, nicht eine Konstante?

Ein Enum mit einem Wert ist gleichzeitig sowohl ein Typ als auch ein Wert. Wenn newInstance() nur Object zurückgeben würde (wobei null = überspringen), müsste der aufrufende Code if (result == null) verwenden. Aber null könnte auch ein legitimes Ergebnis sein (ein wirklich leeres Feld). Die Verwendung eines separaten Typs Status ermöglicht es dem aufrufenden Code, präzise zwischen "dies überspringen" (IGNORE) und "Wert ist nicht vorhanden" (null) zu unterscheiden.

Gegenüberstellung: Status.IGNORE vs. @XmlOmitField vs. Standard-Überspringen

MechanismusGeltungsbereichWann aktiviert
Status.IGNORELaufzeit — pro Element, während des LesensXML-Tag hat keine entsprechende registrierte Java-Klasse
@XmlOmitField (#757)Kompilierzeit — bei FelddeklarationImmer — Feld wird nie serialisiert/deserialisiert
Standardwert-ÜberspringenKompilierzeit — in @XmlFieldFeld entspricht deklariertem Standardwert

Git-Verlauf

868d6abb7 2025 → 2026 (Aktualisierung des Copyright-Jahres)
63081666f Quellcodedatei-Header: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 Paket xstream → xmlstream
ceb63e8a1 Quellcode-Header: (C) 2001-2021
7c79f1922 Copyright des Quell-Headers → 2020
dd5ca38ac CopyRight aller Java-Datei-Header erstellt oder aktualisiert
9ebb88522 Erster Commit
Das Enum hat einen Wert (IGNORE) und hat sich seit dem ersten Commit nie geändert, abgesehen von Copyright-Headern und der Paketumbenennung. Ein Einzelwert-Enum mit einem klaren Sentinel-Zweck ist ein "abgeschlossenes" Design – es gibt nichts hinzuzufügen oder zu ändern. Dies ist eine der stabilsten Dateien in der gesamten ProjectForge-Codebasis.