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

时间:2013-09-05 16:59:36

标签: java enums

所以我目前有两个枚举:

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


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

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

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

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

6 个答案:

答案 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视为滚动自己的日志记录级别的替代方案

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

相关问题