【问题标题】:Enum values and valueOf [duplicate]枚举值和 valueOf [重复]
【发布时间】:2017-11-20 14:20:26
【问题描述】:
public enum ProgramOfStudy {
    ComputerScience("CS"), AutomotiveComputerScience("ACS"), BusinessInformatics("BI");

public final String shortCut;

ProgramOfStudy(String shortCut) {
    this.shortCut = shortCut;
}
public static ProgramOfStudy getByShortCut(String shortCut) {

    for (ProgramOfStudy program : ProgramOfStudy.values()) {
        if (ProgramOfStudy.valueOf(shortCut).equals(program))
            return program;
    }
    return null;
}

}

当像这样调用 getByShortCut 方法时:getByShortCut("CS") 我不断收到错误消息:“No enum constant ProgramOfStudy.CS”我在这里做错了什么?

【问题讨论】:

  • 你做错的是用你的编译器而不是你的头脑思考。将ProgramOfStudy.valueOf(shortCut).equals(program) 更改为program.shortCut.equals(shortCut)
  • getByShortCut 与 valueOf 有何不同???

标签: java enums


【解决方案1】:

如果您需要另一个可以摆脱地图的选项,那么就这样做

public class StackOverF {

    public static void main(String[] args) {
        System.out.println("Hello World1");
        System.out.println(ProgramOfStudy.getByShortCut("CS"));
        System.out.println(ProgramOfStudy.getByShortCut("CSI"));
    }
}

public enum ProgramOfStudy {
    ComputerScience("CS"), AutomotiveComputerScience("ACS"), BusinessInformatics("BI");

    public final String shortCut;

    ProgramOfStudy(String shortCut) {
        this.shortCut = shortCut;
    }

    public static ProgramOfStudy getByShortCut(String shortCut) {

        return Arrays.stream(ProgramOfStudy.values())
            .filter(v -> v.shortCut.equals(shortCut))
            .findFirst()
            .orElse(null);
    }
}

【讨论】:

    【解决方案2】:

    与其循环和纠结于复杂的 equals 条件,为什么不应用一点 Java 8 来解决这个问题?

    public enum ProgramOfStudy {
        ComputerScience("CS"), AutomotiveComputerScience("ACS"), BusinessInformatics("BI");
    
        public final String shortCut;
    
        private static final Map<String, ProgramOfStudy> shortCutMap = Collections.unmodifiableMap(new HashMap<>() {
            {
                Arrays.stream(ProgramOfStudy.values()).forEach(v -> put(v.shortCut, v));
            }
        });
    
        ProgramOfStudy(String shortCut) {
            this.shortCut = shortCut;
        }
    
        public static ProgramOfStudy getByShortCut(String shortCut) {
            return shortCutMap.get(shortCut);
        }
    }
    
    public static void main(String[] args) {
        System.out.println(ProgramOfStudy.getByShortCut("CS"));
        System.out.println(ProgramOfStudy.getByShortCut("ACS"));
        System.out.println(ProgramOfStudy.getByShortCut("baasda"));
        System.out.println(ProgramOfStudy.getByShortCut("BI"));
    }
    

    如果你运行这段 sn-p 代码,它会打印:

    ComputerScience
    AutomotiveComputerScience
    null
    BusinessInformatics
    

    在这种情况下,最好使用映射而不是使用字符串比较的循环。在这种情况下,初始化时只有一个循环,然后再也不会出现。在 getByShortCut 方法的每个查询中使用带有字符串比较的循环并不是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2012-08-31
      • 2016-03-05
      • 2014-08-22
      相关资源
      最近更新 更多