Java将枚举编译成什么?

我和同事讨论了Java如何代表枚举。 我的印象是他们像C / C ++一样严格要求。 或者,如果添加行为(Type-Safe枚举),它将被包装在一个类中。 他认为,如果它足够小,Java会将其压缩到一个字节。

但是,我在Oracle网站上发现了这个:

Java编程语言枚举远比其他语言中的对应程序更强大,这些语言只不过是美化整数。 新的枚举声明定义了一个完整的类(称为枚举类型)。

我认为它们是实际的物体。 如果是这样,有没有办法优化它们以节省空间?

谢谢

编辑:正如Jon对答案的评论中提到的,我是在Enum的序列化大小之后。

不,Java枚举值确实是对象。 它们可以具有字段,方法等 – 以及基于每个值的不同方法实现。 但是,它们只有一组固定的 – 它不像你自己创建枚举类型的实例; 在类型初始化时创建有效值集。 除非你有大量的枚举值,否则你甚至不需要考虑优化。

请注意,只要您在逻辑上考虑一组枚举值, 可以轻松实现一点优化。 这使用位模式来基本上有效地表示集合。

(请注意,C#在这里比Java更接近C ++ – C#枚举可悲的是非面向对象。叹气。)

编辑:枚举值根据文档按名称序列化:

已对序列化添加了支持以处理枚举类型,这是5.0版中的新增类型。 序列化枚举实例的规则与序列化“普通”可序列化对象的规则不同:枚举实例的序列化forms仅包含其枚举常量名称,以及标识其基本枚举类型的信息。 反序列化行为也有所不同 – 类信息用于查找适当的枚举类,并且使用该类和接收的常量名称调用Enum.valueOf方法以获取要返回的枚举常量。

如果你真的在一个小的序列化表格后,你应该避开Java的内置序列化,这是相对冗长的(以及对版本问题非常敏感)。 有各种各样的选择 – 我最熟悉的是Protocol Buffers ,它将枚举值序列化为整数。