Groovy noob here, I’m working through my first Groovy book and it has example code where it states roughly
“If I want a property to be a ready-only property then declare it final. This is not defining a final field but a read-only property-you can change the property from within instance methods of the defining class, but not from outside”
Here is the code I have in question, but I keep getting an error stating:
cannot modify final field 'miles' outside of constructor.
Code:
class Car
{
final miles = 0
def getMiles()
{
println "getMiles called"
miles
}
def drive(dist){if (dist>0) miles += dist }
}
The book says I should be able to modify miles from within the drive instance method, am I doing something wrong?
I think what they meant (not sure what they said, if you’re paraphrasing) is that there’s no setter method defined, so it can’t be modified from outside the class.
It is, however, still a
finalproperty, which means it can’t be modified once its set, which would be in a constructor or during the declaration.Property and field rules
That said, see these two issues: 1628, 2752, so more exploration might be necessary, although this appears limited to local script properties.
My guess is you’re using a 1.7+ Groovy, while the book targets <= 1.6.
See also this SO question.