1

所以我目前有两个枚举:

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


public enum DatabaseLoggingLevel
{
    HIGH,
    MED,
    LOW,
    AUTH_ONLY,
    NONE
}

我希望能够将整数与枚举中的值相关联,这样我就可以编写如下代码:

if(databaseLoggingLevel < ClassName.DatabaseLoggingLevel.HIGH) return;

这只是为了在级别小于时禁用某些日志记录HIGH。我想过制作一个辅助函数,该函数使用 switch 语句返回与每个枚举值关联的整数值,但这似乎很棘手。有什么我想念的吗?

4

6 回答 6

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 值添加常量。例如,假设您要添加一个表示三重四重奏的常量,该四重奏由十二位音乐家组成。对于由 11 位音乐家组成的合奏没有标准术语,因此您不得不为未使用的 int 值 (11) 添加一个虚拟常数。充其量,这很丑陋。如果许多 int 值未被使用,这是不切实际的。

于 2013-09-05T17:01:52.683 回答
3

修改枚举的构造函数以添加 Integer 值。

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;
  }
}
于 2013-09-05T17:00:53.500 回答
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; }

}
于 2013-09-05T17:00:45.550 回答
2

enum与其按照“ s are numbers”来编程,不如按照“ enums are smart”来编程。您可以将数字与enums 相关联(毕竟,enums 是常规 Java 类的实例),但要将该数字设为私有。然后您可以将此方法添加到enum

public boolean isAboveOrEqualTo(DatabaseLoggingLevel level) {
    ...
}

然后您的条件将如下所示:

if (databaseLoggingLevel.isAboveOrEqualTo(ClassName.DatabaseLoggingLevel.HIGH)) {
    ...
}

以下是如何将数字与枚举关联的说明:链接

于 2013-09-05T17:05:03.193 回答
2

使用ordinal() 方法。它为您提供了值在枚举中的位置。

于 2013-09-05T17:02:13.413 回答
0

虽然已经给出的两个答案都可以满足您的需求,但我建议您将 Log4J 作为滚动您自己的日志记录级别的替代方案

http://www.tutorialspoint.com/log4j/log4j_overview.htm

于 2013-09-05T17:04:11.190 回答