在枚举中使用整数值和字符串标识符

tha*_*guy 1 java enums

所以我目前有两个枚举:

public enum AuthorizationLevel 
    {   
        FULL,
        HALF,
        NONE;
    };


public enum DatabaseLoggingLevel
{
    HIGH,
    MED,
    LOW,
    AUTH_ONLY,
    NONE
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将整数与枚举中的值相关联,以便我可以拥有如下代码:

if(databaseLoggingLevel < ClassName.DatabaseLoggingLevel.HIGH) return;
Run Code Online (Sandbox Code Playgroud)

这只是为了在级别小于时禁用某些日志记录HIGH.我想过制作一个辅助函数,它返回一个与每个枚举值相关的整数值和一个switch语句,但这看起来很糟糕.有什么我想念的吗?

Roh*_*ain 6

您可以在枚举中添加整数实例字段,并添加参数化构造函数:

enum AuthorizationLevel {

    FULL(1), HALF(2), NONE(3);

    private final int level;

    private AuthorizationLevel(int level) {
        this.level = level;
    }

    public int getLevel() {
        return level;
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,有一种ordinal()方法可以为您提供枚举常量的位置,但您应该避免使用它.再次引用Effective Java Item - 31(使用实例字段而不是序数):

如果常量被重新排序,则numberOfMusicians方法将中断.如果你想添加一个与你已经使用的int值相关联的第二个枚举常量,那你就不走运了.

此外,如果不为所有插入的int值添加常量,则无法为int值添加常量.例如,假设您要添加一个表示三重奏四重奏的常量,该四重奏由十二位音乐家组成.由11个音乐家组成的合奏没有标准术语,所以你不得不为未使用的int值添加一个虚拟常量(11).充其量,这很难看.如果许多int值未使用,则不切实际.