EN · DE · RU · FR · ES

#752: Status.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java Enum Java — centinela de un solo valor para control de deserialización XML. 32 líneas. Fuente: projectforge-business/src/main/java/org/projectforge/framework/xmlstream/Status.java 32 líneas · 5 código · 25 comentarios · 2 en blanco
Propósito: Un enum con un único valor: IGNORE. 32 líneas, de las cuales 21 son el encabezado de licencia GPLv3. Uno de los archivos más cortos e inusuales del proyecto. El Javadoc en IGNORE explica: "Usado por XmlObjectReader.newInstance(Class, org.dom4j.Element, String)" — es utilizado por el método newInstance() de XmlObjectReader durante la lectura de XML.

¿Por qué un Enum de un Solo Valor?

Este es el Patrón Centinela — un valor especial que señala la necesidad de omitir un elemento durante la lectura. Cuando XmlObjectReader.newInstance() encuentra un elemento XML para el cual no hay una clase registrada (por ejemplo, una etiqueta de una versión antigua del formato que fue eliminada en una versión más reciente), devuelve Status.IGNORE en lugar de fallar con un error.

¿Por qué no simplemente devolver null? Porque null es ambiguo: podría significar "omitir" O "ocurrió un error" O "el elemento está vacío". Status.IGNORE es una señal explícita y nombrada: "Reconozco este elemento como ignorable, lo omito conscientemente, continúo procesando".

Resolución de Tres Estados

El enum permite semánticas limpias de valor de retorno de tres estados:

Object resultado = newInstance(clazz, element, version);
if (resultado == Status.IGNORE) {
    // Elemento desconocido, omitirlo
} else if (resultado == null) {
    // Reconocido pero tiene valor nulo (campo vacío)
} else {
    // Objeto deserializado normal
}

Esto es significativamente más limpio que devolver null con semántica ambigua. El patrón es común en analizadores y deserializadores — por ejemplo, Rust usa Option<T>, Haskell usa Maybe, y aquí — un enum de un solo elemento.

Dónde se Usa

Método XmlObjectReader.newInstance(Class<?> clazz, Element rootElement, String version) — un método de fábrica protegido que las subclases pueden sobrescribir. En cada nivel, verifica AliasMap: si la etiqueta está registrada, crea un objeto; si no está registrada — devuelve Status.IGNORE, y el código llamante omite ese elemento. Esto permite que los archivos XML contengan etiquetas "extra" (por ejemplo, de una versión más reciente del formato cuando son leídos por una versión anterior) sin errores — un mecanismo de compatibilidad hacia atrás.

¿Por qué Enum y no una Constante?

Un enum con un valor es simultáneamente un tipo y un valor. Si newInstance() devolviera solo Object (donde null = omitir), el código llamante necesitaría if (resultado == null). Pero null también podría ser un resultado legítimo (un campo genuinamente vacío). Usar un tipo separado Status permite al código llamante distinguir precisamente entre "omitir esto" (IGNORE) y "el valor está ausente" (null).

Contraste: Status.IGNORE vs. @XmlOmitField vs. Omitir por Defecto

MecanismoÁmbitoCuándo se activa
Status.IGNOREEn tiempo de ejecución — por elemento, durante la lecturaLa etiqueta XML no tiene una clase Java correspondiente registrada
@XmlOmitField (#757)En tiempo de compilación — en la declaración del campoSiempre — el campo nunca se serializa/deserializa
Omitir por valor por defectoEn tiempo de compilación — en @XmlFieldEl campo es igual al valor por defecto declarado

Historial de Git

868d6abb7 2025 → 2026 (actualización de año de copyright)
63081666f Encabezados de archivos fuente: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 paquete xstream → xmlstream
ceb63e8a1 Encabezado de código fuente: (C) 2001-2021
7c79f1922 Copyright del encabezado fuente → 2020
dd5ca38ac CopyRight de todos los encabezados de archivos java actualizado o creado
9ebb88522 Commit inicial
El enum tiene un valor (IGNORE) y nunca ha cambiado desde el commit inicial más allá de los encabezados de copyright y el cambio de nombre del paquete. Un enum de un solo valor con un propósito centinela claro es un diseño "terminado" — no hay nada que añadir o modificar. Este es uno de los archivos más estables de toda la base de código de ProjectForge.