Status.javaIGNORE. 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.
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."
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.
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é.
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).
| Mécanisme | Portée | Quand activé |
|---|---|---|
Status.IGNORE | Runtime — par élément, pendant la lecture | La balise XML n'a pas de classe Java correspondante enregistrée |
@XmlOmitField (#757) | Compilation — sur la déclaration du champ | Toujours — le champ n'est jamais sérialisé/désérialisé |
| Saut de valeur par défaut | Compilation — dans @XmlField | Le champ est égal à la valeur par défaut déclarée |
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
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.