不一致的处理;“最后的”;Groovy闭包中使用的修饰符

不一致的处理;“最后的”;Groovy闭包中使用的修饰符,groovy,Groovy,我在当前稳定的Groovy(v3.0.7)中看到了对“final”修饰符的不同处理:检查条件并设置final变量的相同代码块在常规代码中工作良好,在闭包中使用时失败 例如: public List<Integer> test(String argument) { final value1 if (argument == 'A') { value1 = 1 } else { value1 = 2 } [1

我在当前稳定的Groovy(v3.0.7)中看到了对“final”修饰符的不同处理:检查条件并设置final变量的相同代码块在常规代码中工作良好,在闭包中使用时失败

例如:

public List<Integer> test(String argument) {
    final value1
    if (argument == 'A') {
        value1 = 1
    } else {
        value1 = 2
    }
    
    [1, 2].collect { i ->
        final value2
        if (argument == 'A') {
            value2 = 1 // <-- error
        } else {
            value2 = 2
        }
    
        i + value2 
    }
}

test('A')
我是否遗漏了什么,或者这是Groovy的一个问题

当“if”块替换为三值运算符时,代码起作用:

final value2 = argument == 'A' ? 1 : 2
这似乎证实了这是Groovy bug

我已经用其他版本进行了测试:

  • 2.4.7、2.4.12-工程
  • 2.5.3、2.5.11-失败
    • 我相信Groovy就是这样

      在中,Paul King回答了一个问题(“为什么它使用2.4.x?”):关于最终变量分析器(FVA):

      FVA是一个2.5版本的功能!在2.4中,只有基本的检查,Groovy忽略了许多违规行为。我们目前在2.5实现中有一些误报,尽管我们需要消除这些误报

      我相信Groovy就是这样

      在中,Paul King回答了一个问题(“为什么它使用2.4.x?”):关于最终变量分析器(FVA):

      FVA是一个2.5版本的功能!在2.4中,只有基本的检查,Groovy忽略了许多违规行为。我们目前在2.5实现中有一些误报,尽管我们需要消除这些误报

      final value2 = argument == 'A' ? 1 : 2