【问题标题】:How to match and switch Strings against enums? [duplicate]如何根据枚举匹配和切换字符串? [复制]
【发布时间】:2013-11-03 05:33:06
【问题描述】:

我想将字符串转换为枚举。但是怎么做呢?

class Letter {
    A, B, C
}

String letter = "A";
switch (letter) {
    case Letter.A: //cannot convert from Letter to String
    case Letter.A.toString(): //case expressions must be constant expressions
    case Letter.C.name(): //case expressions must be constant expressions
    default:
}

【问题讨论】:

标签: java enums


【解决方案1】:

如果字符串与枚举中的某个常量不匹配,则抛出java.lang.IllegalArgumentException: No enum constant。尝试下一个:

class Letter {
    A, B, C;
    public static Letter fromString(String str) {
    if (str != null) {
      for (Letter l : Letter.values()) {
        if (l.toString().equals(str)) {
            return l;
        }
      }
    }
    return null;
  }
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    String letter = "A";
    switch (Letter.valueOf(letter)) {
        case A: // No problem!
        case B:
        case C:
        default:
    }
    

    Demo on ideone.

    【讨论】:

    • 我猜这行不通。
    • 我们不能在 case 中使用枚举常量的限定名。它们必须是不合格的名称。所以应该是case A:
    • @shikjohari 已修复,谢谢!
    【解决方案3】:

    这样做。

    Letter l = Letter.valueOf("A");
    

    Letter l = Enum.valueOf(Letter.class, "A");
    
    switch (l) {
        case A:
        case B:
        case C:
        default:
    }
    

    【讨论】:

      【解决方案4】:

      首先创建该枚举而不是 Class 换成这个

      Letter obj = Letter.valueOf(letter);
      switch (obj) {
          case A: //cannot convert from Letter to String
          case B: //case expressions must be constant expressions
          case C: //case expressions must be constant expressions
          default:
      

      【讨论】:

        【解决方案5】:

        首先Letter 必须是一个枚举:

        enum Letter {
            A, B, C
        }
        
        Letter letter = Letter.valueOf("A")
        // and just switch
        switch (letter) {
            case A:
            case B:
            case C:
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多