Status.javaIGNORE. 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.
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."
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.
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.
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.
| Mechanismus | Geltungsbereich | Wann aktiviert |
|---|---|---|
Status.IGNORE | Laufzeit — pro Element, während des Lesens | XML-Tag hat keine entsprechende registrierte Java-Klasse |
@XmlOmitField (#757) | Kompilierzeit — bei Felddeklaration | Immer — Feld wird nie serialisiert/deserialisiert |
| Standardwert-Überspringen | Kompilierzeit — in @XmlField | Feld entspricht deklariertem Standardwert |
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
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.