Groovy 2.1.0 @CompileStatic下switch-case-break语句的奇怪行为

4

我是一名初学者的Groovy程序员,遇到了使用静态编译(@CompileStatic注释)时switch-case-break语句的奇怪行为。似乎break被忽略了。
这是一个错误还是我在阅读文档时错过了什么。

环境:

    - groovy sdk 2.1.0
    - Oracle JDK build 1.7.0_13-b20 on Mac OS X Lion 10.7.5

测试用例:

import groovy.transform.CompileStatic
@CompileStatic
class Test {
    def test() {
        ['A', 'B', 'C'].each { String val ->
            switch (val) {
                case 'A' :
                    println("${val} caseA")
                    break
                case 'B' :
                    println("${val} caseB")
                    break
                default : 
                    println("${val} default")
            }
        }
    }
}
(new Test()).test()

输出:

A caseA
A caseB
A default
B caseB
B default
C default

第二个测试:只需注释@CompileStatic,一切都运行良好。
A caseA
B caseB
C default

1
在我看来似乎是个bug,你能否在Groovy JIRA上报告一下? - tim_yates
是的,我刚刚报告了它 [GROOVY-5984] (http://jira.codehaus.org/browse/GROOVY-5984)。 - Igor Kovalchuk
1
很酷 :-) (看起来昨天已经修复了)我在下面发布了一个含糊不清的不愉快解决方法,以使其与2.1.0一起工作 :-) - tim_yates
1个回答

2

这似乎是Groovy 2.1.0中的一个错误(感谢您将其发布到JIRA,看起来它将在Groovy 2.1.1中得到修复)

在此版本发布之前,您可以使用带标签的块来替代case语句,并使用break退出。

        switch (val) {
            case 'A' : A:{
                println("${val} caseA")
                break
            }
            case 'B' : B:{
                println("${val} caseB")
                break
            }
            default : 
                println("${val} default")
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接