Что Java компилирует перечисление вниз? - PullRequest
8 голосов
/ 02 сентября 2011

Мы с коллегой обсудили, как Java представляет перечисления.У меня сложилось впечатление, что это были строго инты, как C / C ++Или, если вы добавите поведение (перечисление Type-Safe), оно будет заключено в класс.Он полагал, что если он будет достаточно маленьким, Java сведет его к байту.

Однако я нашел это на сайте Oracle:

Перечисления языка программирования Java гораздо более мощные, чем их аналоги в другихязыки, которые немного больше, чем прославленные целые числа.Новое объявление enum определяет полноценный класс (дублирующий тип enum).

Я так понимаю, тогда они являются реальными объектами.Если так, есть ли способ оптимизировать их, чтобы сэкономить место?

Спасибо

Редактировать: Как уже упоминалось в комментарии к ответу Джона, я после размера сериализации Enum.

1 Ответ

18 голосов
/ 02 сентября 2011

Нет, значения перечисления Java действительно являются объектами. Они могут иметь поля, методы и т. Д. - и разные реализации методов для каждого значения. Тем не менее, есть только фиксированный набор из них - вы не создаете экземпляры типа enum самостоятельно; набор допустимых значений создается во время инициализации типа. Если у вас нет огромного числа значений перечисления, очень маловероятно, что вам даже нужно думать об оптимизации.

Обратите внимание, что один бит оптимизации, который является простым для достижения, использует EnumSet всякий раз, когда вы логически рассматриваете набор значений перечисления. При этом используется битовая комбинация для эффективного представления набора.

(Обратите внимание, что C # здесь ближе к C ++, чем Java - перечисления C #, к сожалению, не объектно-ориентированы. Вздох.)

РЕДАКТИРОВАТЬ: значения перечисления сериализуются имя в соответствии с документация :

Добавлена ​​поддержка сериализации для обработки перечислимых типов, которые являются новыми в версии 5.0. Правила сериализации экземпляра enum отличаются от правил сериализации «обычного» сериализуемого объекта: сериализованная форма экземпляра enum состоит только из имени константы enum и информации, идентифицирующей его базовый тип enum. Поведение десериализации также отличается - информация о классе используется для поиска соответствующего класса перечисления, и метод Enum.valueOf вызывается с этим классом и полученным именем константы для получения возвращаемой константы перечисления.

Если вы действительно после небольшой сериализованной формы, вам, вероятно, следует в любом случае избегать встроенной сериализации Java, которая является относительно многословной (а также чрезвычайно чувствительной к проблемам управления версиями). Существуют всевозможные альтернативы, один из которых я знаю лучше всего: Буферы протокола , которые выполняет сериализацию значений перечисления как целых чисел.

...