首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java枚举值

Java枚举值
EN

Stack Overflow用户
提问于 2011-11-10 07:45:36
回答 4查看 6.6K关注 0票数 0

枚举的值是如何计算的?编译器会给它一个静态值吗?它的价值是什么?

我问这个问题的原因是,我想知道通过tcp (或任何进程间)连接使用枚举值会有什么后果。(枚举值,我指的是Enum.VALUE)显然,除非您知道每个枚举的预定值,否则您无法从另一种语言构造与您的程序兼容的包。那么有没有可能计算出每一个的“真实”值呢?使用相同枚举“类”文件的两个Java程序能相互理解吗?

这纯粹是理论上的,请不要责备。不过,指针是很好的。

EN

回答 4

Stack Overflow用户

发布于 2011-11-10 08:13:51

正如前面所解释的,不要依赖底层实现。相反,将枚举设计为在您的控制下存储此类信息。假设您有三个命令要发送到某个嵌入式控制器,通过将一个位模式写入一个寄存器来完成。您希望使用枚举为您提供命令的高级表示,但在某些情况下,您需要这些令人讨厌的位模式:

代码语言:javascript
复制
public enum EmbeddedControllerCommand {

    FOO(0x001), BAR(0x010), BAZ(0x100);

    private int bitPattern = 0;

    EmbeddedControllerCommand(int bitPattern) {
        this.bitPattern = bitPattern;
    }

    public int getBitPattern() {
        return this.bitPattern;
    }

}

只需调用EmbeddedControllerCommand.FOO.getBitPattern()来获取FOO命令的命令模式。

票数 4
EN

Stack Overflow用户

发布于 2011-11-10 07:59:15

如果参考Enum JavaDoc,您可以看到Enum.ordinal()方法返回一个数值常量值,该值由类文件中的Enum声明的顺序决定。

例如,请按字母顺序考虑以下枚举常量:

代码语言:javascript
复制
public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    ORANGE;// ORANGE.ordinal() == 1
    PEAR,  // PEAR.ordinal()   == 2
}

但是如果我们在字母顺序中添加BANANA,看看值将如何变化,从而破坏任何依赖它们的代码:

代码语言:javascript
复制
public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    BANANA,// BANANA.ordinal() == 1
    ORANGE;// ORANGE.ordinal() == 2
    PEAR,  // PEAR.ordinal()   == 3
}

这意味着,只要您使用的是相同版本的源代码,您就可以依赖于相同的基础值,并且可以在没有其他选择的情况下使用它。我之所以说没有其他选择,是因为通过使代码依赖于枚举的顺序,它会使代码更加脆弱,而如果您不依赖序数值,则可以随意重新排序现有的枚举常量或插入新的枚举常量。

现在,你会接受一个温和的责备,因为在发布之前没有仔细阅读JavaDocs吗?:)

票数 2
EN

Stack Overflow用户

发布于 2011-11-10 08:01:31

在Java中,枚举确实有整数引用,Java调用序数。例如,您可以执行yourEnumVariable.ordinal()来获取枚举变量的整数。数字的分配方式是,列表中的第一个数字为0,第二个数字为1,依此类推。

然而,在您的例子中,您似乎不应该关心枚举的内部表示是什么。您应该决定将使用哪种协议来传输信息。在此之后,您可以考虑如何传输枚举值。您可能无论如何都要为协议构建一些映射类,以便从Java映射到协议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8073314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档