Только начал изучать 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 не дают ошибка. Я просмотрел всю документацию, которую мог найти, и не рассматривал эту проблему. Что здесь происходит?
Аарон
В «Программирование Groovy» субраманиан фактически использует использование final в примере кода: «Если вы хотите, чтобы свойство было только для чтения, объявите его окончательным. Это не определение конечного поля, а чтение -only свойство - вы можете изменить свойство из методов экземпляра определяющего класса, но не извне ». Его пример должен был показать использование «final» в этом контексте, но явно не работает. Хотя использование «final» post 1.7 интуитивно понятно для Java-программистов, я не уверен, что это действительно ошибка, а скорее реализация, которую некоторые считают запутанной. – acarlow
@Aaron: Groovy in Action утверждает: «Когда ключевое слово final используется с объявлением свойства, свойство будет доступно только для чтения (метод setter не создается и поле поддержки является окончательным)». Конечно, я несколько предвзятый :) –
Предвзятый информированный ответ лучше, чем его непредвзятое обращение :) Любая идея, почему поведение Subramaniam говорит о сохранении от Groovy-1.0 до Groovy 1.6.8? Если это действительно было ошибкой, кажется, трудно поверить, что она так долго сохранялась. Разве какой-то существующий код не сломается в результате этого изменения? – acarlow