Java将枚举编译成什么?

时间:2011-09-01 21:29:39

标签: java optimization enums compilation java-6

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

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

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

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

由于

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

1 个答案:

答案 0 :(得分:18)

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

请注意,只要您在逻辑上考虑一组枚举值, 很容易实现的一点优化就是使用EnumSet。这使用位模式基本上有效地表示集合。

(请注意,C#在这里比Java更接近C ++ - C#枚举很遗憾地是非面向对象的。叹气。)

编辑:根据the documentation名称序列化枚举值:

  

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

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