EN · DE · RU · FR · ES

#752 : Status.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java Enum Java — sentinelle à valeur unique pour le contrôle de la désérialisation XML. 32 lignes. Source : projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java 32 lignes · 5 de code · 25 commentaires · 2 vides
Objectif : Une énumération avec une valeur unique : IGNORE. 32 lignes, dont 21 sont l'en-tête de licence GPLv3. L'un des fichiers les plus courts et les plus inhabituels du projet. Le Javadoc sur IGNORE explique : "Utilisé par XmlObjectReader.newInstance(Class, org.dom4j.Element, String)" — il est utilisé par la méthode newInstance() de XmlObjectReader lors de la lecture XML.

Pourquoi une énumération à valeur unique ?

C'est le Modèle Sentinelle — une valeur spéciale qui signale la nécessité de sauter un élément lors de la lecture. Lorsque XmlObjectReader.newInstance() rencontre un élément XML pour lequel il n'existe pas de classe enregistrée (par exemple, une balise d'un ancien format de version qui a été supprimée dans une version plus récente), il retourne Status.IGNORE plutôt que de planter avec une erreur.

Pourquoi ne pas simplement retourner null ? Parce que null est ambigu : il pourrait signifier "ignorer" OU "une erreur s'est produite" OU "l'élément est vide". Status.IGNORE est un signal explicite et nommé : "Je reconnais cet élément comme pouvant être ignoré, je le saute consciemment, je continue le traitement."

Résolution à trois états

L'énumération permet une sémantique de valeur de retour à trois états propre :

Object result = newInstance(clazz, element, version);
if (result == Status.IGNORE) {
    // Élément inconnu, on le saute
} else if (result == null) {
    // Reconnu mais a une valeur nulle (champ vide)
} else {
    // Objet désérialisé normal
}

C'est nettement plus propre que de retourner null avec une sémantique ambiguë. Ce modèle est courant dans les analyseurs et désérialiseurs — par exemple, Rust utilise Option<T>, Haskell utilise Maybe, et ici — une énumération à un seul élément.

Où est-il utilisé

Méthode XmlObjectReader.newInstance(Class<?> clazz, Element rootElement, String version) — une méthode fabrique protégée que les sous-classes peuvent redéfinir. À chaque niveau, elle vérifie AliasMap : si la balise est enregistrée, crée un objet ; si elle n'est pas enregistrée — retourne Status.IGNORE, et le code appelant saute cet élément. Cela permet aux fichiers XML de contenir des balises "supplémentaires" (par exemple, d'une version de format plus récente lue par une version plus ancienne) sans erreurs — un mécanisme de rétrocompatibilité.

Pourquoi une énumération, pas une constante ?

Une énumération avec une valeur est à la fois un type et une valeur. Si newInstance() retournait simplement Object (où null = ignorer), le code appelant aurait besoin de if (result == null). Mais null pourrait aussi être un résultat légitime (un champ vraiment vide). Utiliser un type séparé Status permet au code appelant de distinguer précisément entre "ignorer ceci" (IGNORE) et "valeur absente" (null).

Contraste : Status.IGNORE vs. @XmlOmitField vs. Saut par défaut

MécanismePortéeQuand activé
Status.IGNORERuntime — par élément, pendant la lectureLa balise XML n'a pas de classe Java correspondante enregistrée
@XmlOmitField (#757)Compilation — sur la déclaration du champToujours — le champ n'est jamais sérialisé/désérialisé
Saut de valeur par défautCompilation — dans @XmlFieldLe champ est égal à la valeur par défaut déclarée

Historique Git

868d6abb7 2025 → 2026 (mise à jour de l'année de copyright)
63081666f En-têtes des fichiers source : 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 package xstream → xmlstream
ceb63e8a1 En-tête du code source : (C) 2001-2021
7c79f1922 Copyright de l'en-tête source → 2020
dd5ca38ac CopyRight de tous les en-têtes de fichiers java mis à jour ou créés
9ebb88522 Commit initial
L'énumération a une valeur (IGNORE) et n'a jamais changé depuis le commit initial au-delà des en-têtes de copyright et du renommage du package. Une énumération à valeur unique avec un objectif de sentinelle clair est une conception "terminée" — il n'y a rien à ajouter ou à modifier. C'est l'un des fichiers les plus stables de l'ensemble du code source de ProjectForge.