Groovy中的定义与最终定义

r7s23pms  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(160)

我已经使用Spock frameworkGroovy中编写了简单的测试

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
    }
}

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

我的问题是:这两个声明之间有什么区别(如果有的话)?一种方法应该优先于另一种方法吗?如果是的话,原因何在?

xwmevbvl

xwmevbvl1#

在方法中声明的最终变量被当作groovy中的普通变量处理

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

PS:可能Spock中的given:部分以不同的方式生成代码...

z9smfwbn

z9smfwbn2#

用户Daggett是正确的,final不会在Groovy中创建局部变量FINAL。关键字只对类成员有影响。下面是一个小插图:

package de.scrum_master.stackoverflow

import spock.lang.Specification

class MyTest extends Specification {
  def "Final local variables can be changed"() {
    when:
    final def a = 3
    final b = 4
    final int c = 5
    then:
    a + b + c == 12

    when:
    a = b = c = 11
    then:
    a + b + c == 33
  }

  final def d = 3
  static final e = 4
  final int f = 5

  def "Class or instance members really are final"() {
    expect:
    d + e + f == 12

    when:
    // Compile errors:
    // cannot modify final field 'f' outside of constructor.
    // cannot modify static final field 'e' outside of static initialization block.
    // cannot modify final field 'd' outside of constructor.
    d = e = f = 11
    then:
    d + e + g == 33
  }
}

当我将我的一个Spock项目切换到带有Groovy 2.5的1.3版时,注意到由于编译器检测到对最终局部变量的重新赋值,该测试现在不再编译。也就是说,Groovy<=2.4中的不一致似乎已经修复。

相关问题