Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 1.7更改“;最后一句;?_Groovy - Fatal编程技术网

Groovy 1.7更改“;最后一句;?

Groovy 1.7更改“;最后一句;?,groovy,Groovy,刚开始学习Groovy,拿到了PragProg的书“Programming Groovy”,在编译其中一个示例脚本时遇到了问题: class GCar2 { final miles = 0 def getMiles() { println "getMiles called" miles } def drive(dist) { if (dist > 0) { miles += dist } } } def car = ne

刚开始学习Groovy,拿到了PragProg的书“Programming Groovy”,在编译其中一个示例脚本时遇到了问题:

class GCar2 {
  final miles = 0

  def getMiles() {
    println "getMiles called"
    miles
  }

  def drive(dist) {
    if (dist > 0) {
      miles += dist
    }
  }
}

def car = new GCar2()

println "Miles: $car.miles"
println 'Driving'
car.drive(10)
println "Miles: $car.miles"

try {
  print 'Can I see the miles? '
  car.miles = 12
} catch (groovy.lang.ReadOnlyPropertyException ex) {
  println ex.message


Groovy 1.7之前的版本不会给出错误。我查阅了所有我能找到的文件,没有看到讨论的问题。这是怎么回事


Aaron

我对Groovy 1.7不太了解,但它看起来像是早期版本中的一个bug,现在已经修复了——如果变量是final,那么您应该不能在构造函数(或其声明)之外分配给它。如果可以的话,做最后的决定有什么意义


我怀疑它是否会阻止您在构造函数之外读取它,尽管…

您不应该在普通方法中为最终变量赋值。在“Programming Groovy”中,Subramanian实际上在代码示例中鼓吹final的用法:“如果您希望属性是只读的,那么将其声明为final。这不是定义final字段而是只读属性——您可以在定义类的实例方法内更改属性,但不能从外部更改。”他的例子本应显示“final”在该上下文中的用法,但显然不再有效。虽然Java程序员对“final”post 1.7的使用很直观,但我不确定它是否真的是一个bug,而是一个有些人感到困惑的实现。@Aaron:Groovy in Action声明:“当final关键字与属性声明一起使用时,属性将只可读(没有创建setter方法,并且支持字段是final)。”当然,我有点偏见:)有偏见的知情答案比无偏见的相反答案要好:)你知道为什么Subramaniam谈论的行为从Groovy-1.0一直持续到Groovy 1.6.8吗?如果它真的是一个bug,似乎很难相信它会持续这么长时间。一些现有的代码不会因为这个改变而中断吗?@Aaron:老实说,我真的不知道。我怀疑我们在Groovy中编写的实际操作一直都是预期的行为。作为预期行为(IMO),它当然是有意义的。它花了这么长时间才修好,这看起来确实很奇怪。
GroovyCar2.groovy: 20: cannnot access final field or property outside of constructor.
 @ line 20, column 35.
     def drive(dist) { if (dist > 0) miles += dist }
                                     ^