Groovy中的def与最终def

Groovy中的def与最终def,groovy,spock,Groovy,Spock,我已经在Groovy中使用 变量a是使用def和final关键字组合声明的。变量b仅使用final关键字声明 我的问题是:这两个声明之间有什么区别(如果有的话)?是否应该将一种方法预先输入另一种方法?如果是这样,为什么?方法中声明的最终变量会像groovy中的常规变量一样处理 检查下面的类和groovy生成的类(2.4.11) ps:可能spock中的给定:部分以不同方式生成代码。。。 用户是正确的,final不会在Groovy中生成局部变量final。关键字仅对类成员有影响。下面是一个小例子:

我已经在
Groovy
中使用

变量
a
是使用
def
final
关键字组合声明的。变量
b
仅使用
final
关键字声明


我的问题是:这两个声明之间有什么区别(如果有的话)?是否应该将一种方法预先输入另一种方法?如果是这样,为什么?

方法中声明的最终变量会像groovy中的常规变量一样处理

检查下面的类和groovy生成的类(2.4.11)

ps:可能spock中的
给定:
部分以不同方式生成代码。。。

用户是正确的,
final
不会在Groovy中生成局部变量final。关键字仅对类成员有影响。下面是一个小例子:

package de.scrum\u master.stackoverflow
导入spock.lang.Specification
类MyTest扩展了规范{
def“可以更改最终局部变量”(){
什么时候:
最终def a=3
最终b=4
最终整数c=5
然后:
a+b+c==12
什么时候:
a=b=c=11
然后:
a+b+c==33
}
最终def d=3
静态最终e=4
最终整数f=5
def“类或实例成员实际上是最终成员”(){
期望:
d+e+f==12
什么时候:
//编译错误:
//无法在构造函数外部修改最终字段“f”。
//无法在静态初始化块之外修改静态最终字段“e”。
//无法在构造函数外部修改最终字段“d”。
d=e=f=11
然后:
d+e+g==33
}
}


更新:我将一个Spock项目切换到Groovy 2.5版本的1.3,并注意到由于编译器检测到对最终局部变量的重新分配,该测试现在不再编译。也就是说,Groovy中的不一致性没有区别?我认为你的截图没有任何相关信息,可能是你发布了错误的截图。我认为您想向我们展示AST树的字节码视图或子节点。也许你想解决这个问题。我想表明,在解析、转换和规范化步骤之后,这两个变量声明是相同的,因此后面的步骤不会更改此声明,并且在字节码中你不会看到差异。如果我错了,请发布你的正确答案。我从未说过你错了!我甚至在我的回答中提到你,在一次测试中说明了同样的事情。我只是觉得你想分享另一个截图。对你分享的那篇文章的解释对我来说不是很有启发性,只是现在我能看到了。很容易忽略的是,在AST浏览器源代码视图中只有
java.lang.Object a=111
而没有
final
。比“检查下面的图片”或相关部分周围的红框更具解释性的文字会有所帮助。请参阅我在Groovy 2.5中关于行为改变的更新。
class SimpleSpec extends Specification {

    def "should add two numbers"() {
        given:
            final def a = 3
            final b = 4
        when:
            def c = a + b
        then:
            c == 7
    }
}