枚举的值是如何计算的?编译器会给它一个静态值吗?它的价值是什么?
我问这个问题的原因是,我想知道通过tcp (或任何进程间)连接使用枚举值会有什么后果。(枚举值,我指的是Enum.VALUE)显然,除非您知道每个枚举的预定值,否则您无法从另一种语言构造与您的程序兼容的包。那么有没有可能计算出每一个的“真实”值呢?使用相同枚举“类”文件的两个Java程序能相互理解吗?
这纯粹是理论上的,请不要责备。不过,指针是很好的。
发布于 2011-11-10 08:13:51
正如前面所解释的,不要依赖底层实现。相反,将枚举设计为在您的控制下存储此类信息。假设您有三个命令要发送到某个嵌入式控制器,通过将一个位模式写入一个寄存器来完成。您希望使用枚举为您提供命令的高级表示,但在某些情况下,您需要这些令人讨厌的位模式:
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命令的命令模式。
发布于 2011-11-10 07:59:15
如果参考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吗?:)
发布于 2011-11-10 08:01:31
在Java中,枚举确实有整数引用,Java调用序数。例如,您可以执行yourEnumVariable.ordinal()来获取枚举变量的整数。数字的分配方式是,列表中的第一个数字为0,第二个数字为1,依此类推。
然而,在您的例子中,您似乎不应该关心枚举的内部表示是什么。您应该决定将使用哪种协议来传输信息。在此之后,您可以考虑如何传输枚举值。您可能无论如何都要为协议构建一些映射类,以便从Java映射到协议。
https://stackoverflow.com/questions/8073314
复制相似问题