Java枚举值

时间:2011-11-09 23:45:36

标签: java tcp enums

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

我问的原因是因为我想知道在tcp(或任何进程间)连接上使用枚举值的后果是什么。 (通过枚举值我的意思是Enum.VALUE)显然你不能用另一种语言构造与你的程序兼容的数据包,除非你知道每个枚举的预定值。那么有可能找出每个人的“真实”价值吗?并且两个使用相同枚举“类”文件的Java程序会相互理解吗?

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

4 个答案:

答案 0 :(得分:4)

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

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命令的命令模式。

答案 1 :(得分:2)

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

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

public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    ORANGE;// ORANGE.ordinal() == 1
    PEAR,  // PEAR.ordinal()   == 2
}

但是,如果我们按字母顺序添加BANANA,请查看值如何更改,打破任何依赖于它们的代码:

public enum Fruit{
    APPLE, // APPLE.ordinal()  == 0
    BANANA,// BANANA.ordinal() == 1
    ORANGE;// ORANGE.ordinal() == 2
    PEAR,  // PEAR.ordinal()   == 3
}

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

现在,您是否会接受温和的责骂,因为在发布之前没有彻底阅读JavaDocs? :)

答案 2 :(得分:2)

Java Enums中的

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

但是在你的情况下,听起来你不应该关心枚举的内部表示。您应该决定使用哪种协议来传输信息。之后,您可以考虑如何传输枚举值。无论如何,您可能必须为协议构建一些映射类,以便从Java映射到协议。

答案 3 :(得分:0)

您不应该依赖Java编译器提供的enum的预先指定值。不同的语言有不同的方案来处理枚举。在Java中,枚举可以被视为类和对象(不完全用于相同的目的),因此您可以在枚举中创建构造函数并将枚举初始化为所需的值。这是一个相当清楚的例子:

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html