Java编译枚举的目的是什么?

Java编译枚举的目的是什么?,java,optimization,enums,compilation,java-6,Java,Optimization,Enums,Compilation,Java 6,我和一位同事讨论了Java如何表示枚举。我的印象是,它们是严格意义上的INT,就像C/C++。或者,如果添加行为(类型安全枚举),它将被包装在类中。他相信如果它足够小,Java会将它压缩到一个字节 但是,我在Oracle网站上发现了以下内容: Java编程语言枚举比其他语言中的枚举功能强大得多,它们只不过是美化的整数。新的枚举声明定义了一个完整的类(称为枚举类型)。 我认为它们是真实的物体。如果是这样,有没有办法优化它们以节省空间 谢谢 编辑:正如Jon回答的评论中所提到的,我关注的是枚举的序列

我和一位同事讨论了Java如何表示枚举。我的印象是,它们是严格意义上的INT,就像C/C++。或者,如果添加行为(类型安全枚举),它将被包装在类中。他相信如果它足够小,Java会将它压缩到一个字节

但是,我在Oracle网站上发现了以下内容:

Java编程语言枚举比其他语言中的枚举功能强大得多,它们只不过是美化的整数。新的枚举声明定义了一个完整的类(称为枚举类型)。 我认为它们是真实的物体。如果是这样,有没有办法优化它们以节省空间

谢谢


编辑:正如Jon回答的评论中所提到的,我关注的是枚举的序列化大小。

不,Java枚举值实际上是对象。它们可以有字段、方法等,以及基于每个值的不同方法实现。然而,它们只有一个固定的集合——不像您自己创建枚举类型的实例;有效值集是在类型初始化时创建的。除非您有大量的枚举值,否则您甚至不太可能需要考虑优化

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

<>(注意C++比java更接近C++——C语言枚举是非面向对象的。叹气)< /P> 编辑:枚举值按名称序列化,根据:

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


但是,如果您真的想要一个小的序列化表单,那么您可能应该避开Java的内置序列化,因为它相对冗长(并且对版本控制问题非常敏感)。有各种各样的替代品——我最了解的一种,它将EnUM值序列化为整数。< / P>这里有一个Josuha Bloch的引文“表面上,这些枚举类型可能与其他语言类似,如C、C++和C……java的枚举类型是完全FLUCH类。”枚举集非常整洁,但处理的问题不同。我们所关心的空间问题更多地与序列化尽可能小的对象有关。但是,如果我们将枚举剥离到最底层,这似乎是一个没有意义的问题。@Tony:你应该提到你是在追求序列化大小-我有一种潜移默化的怀疑,枚举值被序列化为它们的序数值。@Tony:假设你故意不接受答案,你还在找什么?@Tony:我已经更新了我的答案。事实证明,序列化是按名称而不是按序值进行的(请参阅参考文档)-但是如果您使用Java的二进制序列化,并且大小是一个重要的考虑因素,那么您应该考虑其他选择。如果您需要“优化Java枚举以节省空间”,那么您就错了。特别是,如果你的枚举占用了太多的空间,那么很可能你有太多的枚举。这并不是因为我们有太多的枚举。这就是我们想要传递带有枚举的对象。因此,结构越小,发送的效率就越高。或者是这个想法…如果你使用枚举来定义类型(例如,这是一个Blammy报告,所以它有Type=EnUM,Blammy),他们可能会考虑多态性(比如BrimyRead扩展类……)。但是,当对象不再彼此不同时会发生什么?因此,BullMyReport与TPSReport相同,但具有不同的类型,需要以不同的方式处理?多态性赢得胜利!相同的功能可以在父类中实现,但是可以使用类类型来帮助处理差异。