2010-05-28 2 views
4

Только начал изучать Groovy, получил книгу PragProg "Программирование Groovy" и имел проблемы с компиляцией один из примеров сценариев:Groovy 1.7 изменяет «окончательный»?

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 

GroovyCar2.groovy: 20: cannnot access final field or property outside of constructor. 
@ line 20, column 35. 
    def drive(dist) { if (dist > 0) miles += dist } 
            ^

Groovy до версии 1.7 не дают ошибка. Я просмотрел всю документацию, которую мог найти, и не рассматривал эту проблему. Что здесь происходит?

Аарон

ответ

4

Я не знаю много о Groovy 1.7, но это похоже на ошибку в более ранних версиях, которые теперь были исправлены - если переменная является окончательным, вы не должны быть в состоянии назначить ей вне конструктора (или его объявления). Если да, то в чем смысл сделать его окончательным?

Я сомневаюсь, что это будет мешать Вам чтение его вне конструктора, хотя ...

+0

В «Программирование Groovy» субраманиан фактически использует использование final в примере кода: «Если вы хотите, чтобы свойство было только для чтения, объявите его окончательным. Это не определение конечного поля, а чтение -only свойство - вы можете изменить свойство из методов экземпляра определяющего класса, но не извне ». Его пример должен был показать использование «final» в этом контексте, но явно не работает. Хотя использование «final» post 1.7 интуитивно понятно для Java-программистов, я не уверен, что это действительно ошибка, а скорее реализация, которую некоторые считают запутанной. – acarlow

+0

@Aaron: Groovy in Action утверждает: «Когда ключевое слово final используется с объявлением свойства, свойство будет доступно только для чтения (метод setter не создается и поле поддержки является окончательным)». Конечно, я несколько предвзятый :) –

+0

Предвзятый информированный ответ лучше, чем его непредвзятое обращение :) Любая идея, почему поведение Subramaniam говорит о сохранении от Groovy-1.0 до Groovy 1.6.8? Если это действительно было ошибкой, кажется, трудно поверить, что она так долго сохранялась. Разве какой-то существующий код не сломается в результате этого изменения? – acarlow

5

Вы не должны быть в состоянии присвоить конечной переменной в обычном методе. Это был bug in groovy, зафиксированный в 1.7.

Смежные вопросы