【问题标题】:Constant expression required error in switch statement with strings [duplicate]带有字符串的switch语句中的常量表达式需要错误[重复]
【发布时间】:2015-11-02 03:29:12
【问题描述】:

我收到一个大致如下所示的 JSON 响应。

{
  "status": "success",
  "data": [
    {
      ....
    }
  ]
}

status 字段可以有两个值:成功失败

所以在我的代码中,我有以下枚举。

private enum Status {
    SUCCESS("success", 0),
    FAIL("fail", 1);

    private String stringValue;
    private int intValue;
    private Status(String toString, int value) {
        stringValue = toString;
        intValue = value;
    }

    @Override
    public String toString() {
        return stringValue;
    }
}

我要做的是在switch语句中,我需要检查状态值并在每个条件下执行代码。

String status = jsonObj.getString("status");

switch (status) {
    case Status.SUCCESS.toString():
        Log.d(LOG_TAG, "Response is successful!");
    case Status.FAIL.toString():
        Log.d(LOG_TAG, "Response failed :(");
    default:
        return;
}

但我在每种情况下都得到需要常量表达式错误。

我检查了Status.SUCCESS.toString()Status.FAIL.toString() 返回的值,它们确实返回了字符串。

知道为什么还会出现这个错误吗?

【问题讨论】:

  • 不要忘记breakswitch(Status.fromValue(status)) { case Success:
  • 我没有投反对票,但我猜你得到了这样的回应,因为 Java switch 语句是一种基本的语言功能,并且可以通过 Google 轻松获得信息。
  • 你为什么不直接写case "success":case "failure":
  • @DavidWallace:我想这样做意味着在不止一个地方输入“成功”,打破en.wikipedia.org/wiki/Don%27t_repeat_yourself
  • 是的,但替代方法是使用valueOf 方法,然后在Enum 上使用switch;这是有问题的,因为如果String 错误,它会引发异常。

标签: java android string enums switch-statement


【解决方案1】:

case 语句必须是编译时可评估的。

Status.SUCCESS.toString() 这样的东西不能满足这一点。另一方面,字符串 literal 可以。

明显的解决方法是使用 if 块。

【讨论】:

  • 我也一样。使用 if-else 就足够了
  • 谢谢。这样可行! if 语句不是最优雅的东西,但很好,该怎么做。再次感谢。
  • .....但是为什么呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多