EN · DE · RU · FR · ES

#753: XmlConstants.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlConstants.java Java-Konstantenklasse — Sentinel-Werte für das XmlStream-Framework. 36 Zeilen. Quelle: projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlConstants.java 36 Zeilen · 7 Code · 25 Kommentare · 4 leer
Zweck: Eine globale Konstantenklasse, die drei Sentinel-Werte enthält – magische Zahlen/Zeichenfolgen, die garantiert nie in echten Daten vorkommen. Sie werden vom XmlStream-Serialisierer verwendet, um den Zustand „Standardwert nicht gesetzt" zu erkennen, und von Konvertern, um null darzustellen.

Drei Konstanten

  1. MAGIC_INT_NUMBER = -21111970 — Eine negative achtstellige Zahl, die niemals eine legitime ID oder Menge sein wird. Wird als Standardwert für defaultIntValue in der Annotation @XmlField verwendet. Wenn ein int-Feld diesen Wert hat, wird es NICHT nach XML serialisiert – das spart Platz. Wahrscheinlich abgeleitet vom Geburtsdatum eines Entwicklers (21.11.1970), eine gängige Praxis für die Wahl harmloser magischer Zahlen.
  2. MAGIC_STRING = "faiNg8jojae4Aiy5thaiz7Iefu4Egoarafa6Fu3xEekil8ae" — Eine 46 Zeichen lange zufällige Zeichenfolge ohne Leerzeichen oder Sonderzeichen. Wird als Standard für defaultStringValue verwendet. Kein echter Benutzer wird dies jemals als Namen oder Beschreibung eingeben. Bei Übereinstimmung wird das Feld während der Serialisierung übersprungen.
  3. NULL_IDENTIFIER = "null" — Eine spezielle Zeichenfolgenkennung für Nullwerte in XML. Wenn ein Feld null ist, schreibt XmlObjectWriter die literale Zeichenfolge "null" (anstatt das Tag wegzulassen). XmlObjectReader stellt null wieder her, wenn es "null" liest. Der Code-Kommentar warnt: „Nicht wirklich für Zeichenfolgen verwendbar, sollte aber von allen anderen Konvertern als Nullwert interpretiert werden." Bei Zeichenfolgenfeldern könnte das literale „null" legitime Daten sein, daher funktioniert dies nur für Zahlen, Daten, Booleans usw.

Magische Zahl / Standard-Überspringungsmuster

Das Design: Während der Serialisierung wird ein Feld aus der XML-Ausgabe weggelassen, wenn sein Wert dem deklarierten Standard (aus der @XmlField-Annotation) entspricht. Während der Deserialisierung erhält ein Feld den Standardwert, wenn es in XML fehlt. Dies verkleinert die XML-Ausgabe (besonders wichtig für boolesche Felder, bei denen false der typische Standard ist) und macht XML lesbarer, indem nur aussagekräftige Felder angezeigt werden. Die Konstanten MAGIC_INT_NUMBER und MAGIC_STRING dienen als Sentinel für „nicht gesetzt" – sie unterscheiden zwischen „der Entwickler hat absichtlich einen Standard von 0/leerer Zeichenfolge gesetzt" und „der Entwickler hat keinen Standard gesetzt." Die Methode hasDefaultType() in XmlObjectWriter vergleicht mit diesen Sentinel-Werten, um zu entscheiden.

Warum eine Konstantenklasse statt Enum oder Konfiguration?

Im modernen Java könnten dies Enum-Werte oder Konfigurationseigenschaften sein. Aber als Konstantenklasse:

Verbraucher: XmlObjectWriter.isDefaultType() und hasDefaultType()

hasDefaultType() prüft, ob ein Standard explizit in @XmlField deklariert wurde: Wenn kein Standard deklariert wurde, wird das Feld immer serialisiert. Wenn ein Standard deklariert wurde und der Wert übereinstimmt, wird das Feld übersprungen.

Git-Verlauf

868d6abb7 2025 → 2026 (Aktualisierung des Copyright-Jahres)
63081666f Quelldatei-Header: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 Paket xstream → xmlstream (umbenannt, um Verwechslungen mit der XStream-Bibliothek zu vermeiden)
ceb63e8a1 Quellcode-Header: (C) 2001-2021
7c79f1922 Copyright des Quell-Headers → 2020
dd5ca38ac CopyRight aller Java-Datei-Header aktualisiert oder erstellt
9ebb88522 Erster Commit
Die Konstanten haben sich seit dem ersten Commit nicht geändert. Nur Copyright-Header und die Paketumbenennung (xstreamxmlstream bei cd27dd997) haben diese Datei berührt. Die Stabilität ist zu erwarten – dies sind grundlegende Sentinel-Werte; eine Änderung würde die Serialisierungskompatibilität mit allen zuvor geschriebenen XML-Dateien brechen.