所以我目前有两个枚举:
public enum AuthorizationLevel
{
FULL,
HALF,
NONE;
};
public enum DatabaseLoggingLevel
{
HIGH,
MED,
LOW,
AUTH_ONLY,
NONE
}
我希望能够将整数与枚举中的值相关联,以便我可以拥有如下代码:
if(databaseLoggingLevel < ClassName.DatabaseLoggingLevel.HIGH) return;
这只是为了在级别小于HIGH
时禁用某些日志记录。我想过制作一个辅助函数,它返回一个与每个枚举值相关的整数值和一个switch语句,但这看起来很糟糕。有什么我想念的吗?
答案 0 :(得分: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;
}
};
请注意,有一个ordinal()
方法可以为您提供枚举常量的位置,但您应该避免使用它。再次引用Effective Java Item - 31 (Use instance fields instead of ordinal):
如果常量被重新排序,则numberOfMusicians方法将 打破。如果你想添加一个与之关联的第二个枚举常量 你已经使用的int值,你运气不好。
此外,如果不添加,则无法为int值添加常量 所有插入的int值的常量。例如,假设你 想要添加一个代表三重奏四重奏的常量 十二位音乐家合奏没有标准术语 由十一位音乐家组成,所以你被迫添加一个假人 未使用的int值的常量(11)。充其量,这很难看。如果很多 int值未使用,这是不切实际的。
答案 1 :(得分:2)
public enum DatabaseLoggingLevel
{
HIGH(1),
MED(2),
LOW(3),
AUTH_ONLY(4),
NONE(5)
private int code;
private DatabaseLoggingLevel(int code) {
this.code = code;
}
public int getCode() { return code; }
}
答案 2 :(得分:2)
修改枚举的构造函数以添加整数值。
public enum DatabaseLoggingLevel {
HIGH(1),
MED(2),
LOW(3),
AUTH_ONLY(4),
NONE(5);
private final Integer value;
//For getByValue(). See Rohit's comment
private static final DatabaseLoggingLevel[] VALUES = DatabaseLoggingLevel.values();
private DatabaseLoggingLevel(Integer value) {
this.value = value;
}
public Integer getValue() {
return this.value;
}
//Bonus : getter by value:
public static DatabaseLoggingLevel getByValue(Integer value) {
for(DatabaseLoggingLevel e: VALUES) {
if(e.getValue().equals(value)) {
return e;
}
}
return null;
}
}
答案 3 :(得分:2)
使用ordinal() method。它为您提供枚举中Value的位置。
答案 4 :(得分:2)
不是根据“enum
s是数字来编程”,而是根据“enum
s聪明”来编程。您可以将数字与enum
关联起来(毕竟,enum
是常规Java类的实例),但要将该数字设为私有。然后,您可以将此方法添加到enum
:
public boolean isAboveOrEqualTo(DatabaseLoggingLevel level) {
...
}
然后您的条件将如下所示:
if (databaseLoggingLevel.isAboveOrEqualTo(ClassName.DatabaseLoggingLevel.HIGH)) {
...
}
以下是如何将数字与枚举相关联的说明:link。
答案 5 :(得分:0)
虽然已经给出的两个答案都可以满足您的需求但我建议您将Log4J视为滚动自己的日志记录级别的替代方案