2011-11-09 159 views
0

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

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

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

回答

0

您不应该依赖Java编译器给出的枚举的预先分类值。不同的语言有不同的方案来处理枚举。在Java中,枚举可以像一个类和对象一样对待(不完全是为了相同的目的),所以你可以在你的枚举中创建一个构造函数并将枚举初始化为你想要的值。这是一个非常明显的例子:

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

2

如果你指的是Enum JavaDoc你可以读到,Enum.ordinal()方法返回由类文件枚举声明的顺序确定的数值恒定值。

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

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

但是,如果我们在它的字母位置添加香蕉,看到的值将如何改变,打破了依赖于他们的任何代码:

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

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

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

2

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

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

+0

+1用于指示协议和映射。这比我的回答更好 – gigadot

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