Java将枚举编译成什么?

Ton*_*ony 8 java optimization enums compilation java-6

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

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

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

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

谢谢

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

Jon*_*eet 18

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

注意优化的那一位,很容易被利用来实现EnumSet,只要你考虑逻辑一组枚举值.这使用位模式来基本上有效地表示集合.

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

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

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

如果你真的在一个小的序列化表格之后,你应该避开Java的内置序列化,这是相对冗长的(以及对版本问题非常敏感).有各种替代品-一个我知道的最好的协议缓冲区,它序列化枚举值只是整数.