Пользователь Даггетт верно, final
не делает локальную переменную окончательной в Groovy.Ключевое слово влияет только на членов класса.Вот небольшая иллюстрация:
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 на версию 1.3 с Groovy 2.5 и заметил, что этот тест больше не компилируется из-закомпилятор, обнаруживающий переназначение конечных локальных переменных.Т.е. несоответствие в Groovy <= 2.4 кажется исправленным. </p>