Java枚举值

Java枚举值,java,tcp,enums,Java,Tcp,Enums,如何计算枚举的值?编译器是否给它一个静态值?它有什么价值 我之所以问这个问题,是因为我想知道在tcp(或任何进程间)连接上使用枚举值会有什么后果。(我所说的枚举值是指enum.value)显然,除非您知道每个枚举的预定义值,否则无法从另一种语言构建与您的程序兼容的数据包。那么,有没有可能计算出每一个的“真实”值呢?两个使用相同枚举“类”文件的Java程序会相互理解吗 这纯粹是理论,请不要责骂。不过,指针是好的。您不应该依赖Java编译器提供的enum的预分配值。不同的语言有不同的enum处理方案

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

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


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

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

如果参考,则可以看到该方法返回一个数值常量值,该值由类文件中枚举声明的顺序决定

例如,按字母顺序考虑这些EnUM常量:

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而接受温和的责骂吗?:)

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


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

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

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表示协议和映射。这比我的答案还要好