Нет, значения перечисления Java действительно являются объектами. Они могут иметь поля, методы и т. Д. - и разные реализации методов для каждого значения. Тем не менее, есть только фиксированный набор из них - вы не создаете экземпляры типа enum самостоятельно; набор допустимых значений создается во время инициализации типа. Если у вас нет огромного числа значений перечисления, очень маловероятно, что вам даже нужно думать об оптимизации.
Обратите внимание, что один бит оптимизации, который является простым для достижения, использует EnumSet
всякий раз, когда вы логически рассматриваете набор значений перечисления. При этом используется битовая комбинация для эффективного представления набора.
(Обратите внимание, что C # здесь ближе к C ++, чем Java - перечисления C #, к сожалению, не объектно-ориентированы. Вздох.)
РЕДАКТИРОВАТЬ: значения перечисления сериализуются имя в соответствии с документация :
Добавлена поддержка сериализации для обработки перечислимых типов, которые являются новыми в версии 5.0. Правила сериализации экземпляра enum отличаются от правил сериализации «обычного» сериализуемого объекта: сериализованная форма экземпляра enum состоит только из имени константы enum и информации, идентифицирующей его базовый тип enum. Поведение десериализации также отличается - информация о классе используется для поиска соответствующего класса перечисления, и метод Enum.valueOf вызывается с этим классом и полученным именем константы для получения возвращаемой константы перечисления.
Если вы действительно после небольшой сериализованной формы, вам, вероятно, следует в любом случае избегать встроенной сериализации Java, которая является относительно многословной (а также чрезвычайно чувствительной к проблемам управления версиями). Существуют всевозможные альтернативы, один из которых я знаю лучше всего: Буферы протокола , которые выполняет сериализацию значений перечисления как целых чисел.