【问题标题】:byte from Enum class without cast来自 Enum 类的字节,没有强制转换
【发布时间】:2021-03-02 20:34:31
【问题描述】:

在 Java 中可以有一个字节值而不是 int 值的枚举?

public enum PacketTypes {
    REQUEST_CO_SERVER, ACCEPTANCE, REFUSAL, REQUEST_CO_USER, PUBLIC_MSG, PRIVATE_MSG
}

【问题讨论】:

  • 使用字节值而不是 int 值”是什么意思? Enums 既没有 byte- 也没有 int- 值。 --- 这听起来像XY problem
  • enum 工作起来很像一个类,你可以给它添加字段和方法。类似于:enum PacketType { REQUEST_CO_SERVER((byte)10), ... ; private final byte code; private PacketType(byte code) { this.code = code; } public byte getCode() { return code; } }
  • 定义自定义构造函数为每个枚举分配字节值。

标签: java enums


【解决方案1】:

Java 枚举是一个type-safe 实现,您实际上并不关心常量映射到什么类型。严格来说,您的问题的答案是“否”,因为 java.lang.Enum.ordinal 被烘焙为 int

如果您正在寻找一些位标志的实现,您可能需要java.util.BitSet

commented by @user15244370,如果你想给每个枚举对象关联一个值,比如字节值,在枚举上声明一个成员字段。添加一个构造函数,该构造函数将每个枚举对象的所需值存储在成员字段中。

【讨论】:

  • 谢谢,但 Turing85 是正确的 here
【解决方案2】:

Comment by user15244370correct Answer by Tomáš Záluský 中所述,这里是一个枚举的示例代码,该枚举携带一个byte 成员字段,该字段使用传递给枚举构造函数的值进行初始化。

顺便说一句,您的枚举名称应该是单数而不是复数,PacketType 而不是 PacketTypes

enum PacketType {
    ACCEPTANCE ( (byte) 101 ), // Calling constructor on this enum class.
    REFUSAL ( (byte) 42 ) ;
    
    // Member field.
    private byte byteCode ;
    
    // Constructor.
    PacketType ( byte b ) { this.byteCode = b ; }
    
    // Getter method, for a read-only property of this enum.
    byte getByteCode() { return this.byteCode ; }
    
}

在这里,我使用int 的转换来获得byte。显然 Java 不提供 byte 文字的语法。见How do you specify a byte literal in Java?

现在看到该枚举与以下code running live at IdeOne.com 一起使用。

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println( 
            PacketType.REFUSAL.toString() 
            + " = " 
            + PacketType.REFUSAL.getByteCode() 
        ) ;
    }
}

enum PacketType {
    ACCEPTANCE ( (byte) 101 ),                     // Calling constructor on this enum class.
    REFUSAL ( (byte) 42 ) ;
    
    private byte byteCode ;                        // Member field.
    
    PacketType ( byte b ) { this.byteCode = b ; }  // Constructor.
    
    byte getByteCode() { return this.byteCode ; }  // Getter method, for a read-only property of this enum.
    
}

拒绝 = 42

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多