【问题标题】:How to compare a string with an Enum in a switch?如何将字符串与开关中的枚举进行比较?
【发布时间】:2020-10-27 14:12:45
【问题描述】:

我有一个像下面这样的枚举:

public enum TripType {
  TRIP1,
  TRIP2,
  TRIP3,
  TRIP4
}

然后我有一个接收字符串参数setupTravel(String tripType) 的方法,我需要使用TripType 检查tripType 的值。我希望使用如下开关盒:

setupTravel(String tripType){
    switch (tripType){
      case TripType.TRIP1.toString():
        setup1();
        break;
      case TripType.TRIP2.toString():
        setup2();
        break;
    }
}

但是,在TripType.TRIP1.toString() 行中,它抱怨: Constant expression required

我该如何解决?

【问题讨论】:

  • setupTravel 是你的方法吗?它必须带一个字符串吗?
  • 只是一个提示。不确定它是否对您有用。您可以使用枚举构造函数对每个枚举值执行不同的操作。您可以完全避免使用开关盒或 if-else 阶梯。我总是觉得它更易读、更好。

标签: java switch-statement


【解决方案1】:
setupTravel(String tripType) {
  try {
    switch (TripType.valueOf(tripType)) {
      case TRIP1:
        setup1();
        break;
      case TRIP2:
        setup2();
        break;
    }
  } catch (IllegalArgumentException ex) {
    // Handle invalid trip type here
  }
}

【讨论】:

  • 我认为最好指出如果tripType 不包含不属于枚举的内容(例如TRIP5),则会引发异常。
  • 捕获错误字符串的 IllegalArgumentException.. 并且应该删除 TripType.
【解决方案2】:

既然你的方法似乎开启了 Enum 字符串,为什么不直接使用 Enum 呢?你可能想要包含一个default,除非你在 switch 块中有所有的枚举。

setupTravel(TripType type){
    switch (type){
      case TRIP1:
        setup1();
        break;
      case TRIP2:
        setup2();
        break;
    }
}

你可以这样称呼它

setupTravel(TripType.TRIP1)

【讨论】:

    【解决方案3】:

    如果它对你有用,你可以使用枚举构造函数而不是使用 switch case。 像这样的:

    public enum TripType {
        TRIP1("setup1"), TRIP2("setup2");
        String setup;
        private TripType(String setup) {
            this.setup = setup;
        }
        public String getSetup() {
            return setup;
        }
        public static TripType getTripTypeByName(String name) {
            return Arrays.stream(TripType.values()).filter(t -> t.name().equalsIgnoreCase(name)).findAny().orElse(null);
        }
    }
    

    根据名称获取枚举,您可以这样使用:

    TripType tripType = TripType.getTripTypeByName("trip1");
    System.out.println(tripType != null ? tripType.getSetup() : null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多