【问题标题】:Using Static String in Groovy Switch-Case Statement在 Groovy Switch-Case 语句中使用静态字符串
【发布时间】:2012-05-03 14:57:55
【问题描述】:

我是一名涉足 Groovy 的 Java 程序员。您会在我的代码中注意到,我混合了一些特定于 Java 的语法,这在 Groovy 中被认为是 A-Okay。

谁能向我解释为什么 Groovy 不接受静态变量作为 CASE 参数?或者如果可以,你能看到我在这里做错了什么吗?

public static final String HIGH_STRING = "high";
public static final String LOW_STRING  = "low";

... //other code, method signature, etc.

def val = "high";
switch (val) {

   case HIGH_STRING:
     println("string was high"); //this won't match
     break;

   case LOW_STRING:
     println("string was low");  //this won't match
     break;

   //case "high":
   //  println("string was high"); //this will match because "high" is a literal
   //  break;

   default:
     println("no match");
}

... //other code, method closeout, etc.

【问题讨论】:

  • 您的测试用例对我有用。请在失败的地方发布完整的测试。另外,您使用的是什么版本的 groovy?
  • 你们是对的。我在 Grails 应用程序中工作,我在服务类中执行此操作switch。我在应用程序运行时添加了public static final 声明,Grails 似乎相应地更新了这些类。我发现它不是(奇怪的是,仅在那些public static final vars 上,因为其他代码更改正在发生)。我重新启动了我的应用程序,现在它可以工作了。

标签: string groovy switch-statement case


【解决方案1】:

我知道这并不能回答您的问题,即为什么您的代码不适合您,但是如果您想要一种稍微时髦/更好的方式来实现您的代码,您可以将您的值放入映射中,这样您就不会必须使用switch 声明:

class ValueTests {
    public static final String HIGH_STRING = "high"
    public static final String LOW_STRING  = "low"

    @Test
    void stuff() {
        assert "string was high" == getValue("high")
        assert "string was low" == getValue("low")
        assert "no match" == getValue("higher")
    }

    def getValue(String key) {
        def valuesMap = [
            (HIGH_STRING): "string was high", 
            (LOW_STRING):"string was low"
        ]
        valuesMap.get(key) ?: "no match"
    }

}

switch IMO 干净一点。

【讨论】:

  • 这不是我想要的,但你会从我上面的评论中看到,这是我自己懒散的错误,这不起作用。不过,您在此处提供的有趣方法是任何人发布的最接近正确答案的方法,因此我会接受。我喜欢学习处理这些东西的新方法,所以感谢您抽出宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多