EN · DE · RU · FR · ES

#760: Status.java

Строк: 32 · Тип: Java enum — одиночное значение · Пакет: org.projectforge.framework.xmlstream

Что это

Перечисление (enum) с одним единственным значением: IGNORE. 32 строки, из которых 21 — лицензия GPLv3. Один из самых коротких и необычных файлов в проекте. Javadoc на значении IGNORE: "Used by XmlObjectReader.newInstance(Class, org.dom4j.Element, String)" — используется методом newInstance() класса XmlObjectReader.

Зачем нужен enum с одним значением?

Это паттерн Sentinel (страж) — специальное значение, которое сигнализирует о необходимости пропустить элемент при чтении. Когда XmlObjectReader.newInstance() встречает XML-элемент, для которого нет зарегистрированного класса, он возвращает Status.IGNORE вместо ошибки.

Почему просто не вернуть null? Потому что null неоднозначен: он может означать "пропустить" ИЛИ "произошла ошибка" ИЛИ "элемент пустой". Status.IGNORE — это явный, именованный сигнал.

Трёхзначная семантика

Object result = reader.newInstance(clazz, element, version);
if (result == Status.IGNORE) {
    // элемент нераспознан, пропускаем
} else if (result == null) {
    // распознан, но значение null (поле пустое)
} else {
    // нормальный объект
}

Это значительно чище, чем возвращать null с неоднозначной семантикой.

Где используется

Метод XmlObjectReader.newInstance() — фабричный метод, который подклассы могут переопределить. На каждом уровне проверяет AliasMap: если тег зарегистрирован, создаёт объект; если не зарегистрирован — возвращает Status.IGNORE. Это позволяет XML-файлам содержать "лишние" теги без ошибок — механизм обратной совместимости.

Сравнение: Status.IGNORE vs @XmlOmitField vs Default Skipping

МеханизмОбластьКогда срабатывает
Status.IGNORERuntime — поэлементно, при чтенииXML-тег без зарегистрированного Java-класса
@XmlOmitField (#757)Compile-time — на объявлении поляВсегда — поле не сериализуется/десериализуется
Default-value skippingCompile-time — в @XmlFieldЗначение поля равно default

Git History

868d6abb7 2025 → 2026
63081666f Source file headers: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 package xstream → xmlstream
ceb63e8a1 Source code header: (C) 2001-2021
7c79f1922 Copyright of source header → 2020
dd5ca38ac CopyRight of all java file-header updated or created
9ebb88522 Initial commit

Enum с одним значением (IGNORE) никогда не менялся. Одноэлементный enum с чёткой sentinel-целью — это "завершённый" дизайн, не требующий модификаций. Один из самых стабильных файлов во всей кодовой базе ProjectForge.