今天,我在Groovy中遇到了一个特殊的问题/功能。
看起来可以使用Groovy中的++
运算符来增加最终字段。
它看起来像是一个错误吗?这种行为与我对Java的期望不一致。 有谁知道怎么可能?
我准备了一点Spock测试来确定问题所在。
import spock.lang.Specification
class FinalModifierTest extends Specification {
def 'tests bizarre behaviour of final modifier in Groovy'() {
given:
Adder adder = new Adder()
expect:
adder.number.class == Integer
when:
adder.number = 7
then:
thrown(ReadOnlyPropertyException)
when:
adder.increment()
then:
adder.number == 2
}
}
class Adder {
final int number = 1
void increment() {
number++
}
}
显然,InteliJ通过以下消息告诉我有关最终字段分配的信息: '无法为最终字段编号分配值,但是代码仍会编译,更糟糕的是,它会成功执行!
我在上面的例子中运行:
JVM:1.7.0_51
Groovy:2.2.2