值在x和y之间的java枚举

hjzp0vay  于 2023-01-16  发布在  Java
关注(0)|答案(3)|浏览(111)

这是一个简单的问题:
有没有可能有一个带有变量值的枚举?
为了清楚起见,我想创建一个枚举,它对应于函数返回的错误代码,它是两个字节,所以我想做如下操作

public enum ErrorCode {
    
    ERR_NONE      ((byte)0x9000),        // No error
    ERR_PARAM     ((byte)0x8200),     // Parameter error
    ERR_DATA ((byte)0x83XX),    // XX could be any value

}

如何为所有从0x83开始的值返回ERR_DATA?
有可能吗?
谢谢

fslejnso

fslejnso1#

下面是根据Dawood ibn Kareem在上面评论中的建议实现的。
一些要点:

  • 如果一个代码匹配两个枚举值,这个实现抛出一个异常。你需要决定你是否想要这个行为,或者只返回第一个匹配。在这种情况下,枚举值的顺序变得很重要。
  • 你可以为常见的情况添加新的构造函数,例如,我有一个用于匹配单个代码的值,你可以为匹配一系列代码的值添加一个构造函数。
  • 如果没有ErrorCode匹配整数代码,你可能也想抛出一个异常,这个实现在这种情况下返回null,所以如果调用者没有检查null,你会得到一个NPE,但是你不知道是什么值触发了它。
import java.util.function.Predicate;

public enum ErrorCode {
    ERR_NONE      (0x9000),        // No error
    ERR_PARAM     (0x8200),     // Parameter error
    ERR_DATA (n -> (n >= 0x8300 && n <= 0x83FF)),    // 0x83XX
    ERR_ANOTHER_83 (0x8377);
    private final Predicate<Integer> forValue;

    ErrorCode(Predicate<Integer> matches) {
        this.forValue = matches;
    }

    ErrorCode(int singleValue) {
        this(n -> n == singleValue);
    }

    public static ErrorCode forInt(int code) {
        ErrorCode matchingCode = null;
        for (ErrorCode c : ErrorCode.values()) {
            if (c.forValue.test(code)) {
                if (matchingCode != null) {
                    throw new RuntimeException("ErrorCodes " + matchingCode.name() 
                       + " and " + c.name() + " both match 0x" 
                       + Integer.toHexString(code));
                } else {
                    matchingCode = c;
                }
            }
        }
        return matchingCode;
    }

    public static void main(String[] args) {
        System.out.println(ErrorCode.forInt(0x8312));
        System.out.println(ErrorCode.forInt(0x9000));
        System.out.println(ErrorCode.forInt(0x8377));
    }
}
q8l4jmvw

q8l4jmvw2#

编写一个方法,给定0x83NN作为输入,返回ERR_DATA. Done。

ErrorCode errorCode(int n) {
    if (n == 0x9000)
        return ERR_NONE;
    else if (n == 0x8200) 
        return ERR_PARAM;
    else if (n >= 0x8300 && n <= 0x83ff)
        return ERR_DATA;
    else
        throw new IllegalArgumentException();
}

在任何情况下都必须编写代码来查找值。没有内在的“将此整数值与此枚举常量相关联,并为给定整数值的枚举常量提供查找”。
注意,对于这个,不需要在枚举的每个成员中存储数值,还要注意,除非定义了合适的构造函数,否则ERR_NONE(0x9000)这样的构造函数调用是无效的,如果定义了合适的构造函数,则需要为ERR_DATA的参数确定一个值。

h7appiyu

h7appiyu3#

我觉得不可能,根据甲骨文的说法,
枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。变量必须等于为其预定义的值之一。

相关问题