Чи потрібно змінювати цю останню власність? Книги говорять, що я повинен, але я отримую помилку

Groovy noob тут, я працюю через мою першу Groovy книгу, і вона має приклад коду, де він вказує приблизно

"Якщо ми хочемо, щоб властивість було лише властивістю, лише оголосити її остаточно. методів визначення класу, але не ззовні "

Ось код, який я маю на увазі, але я постійно отримую помилку про те, що:

не може змінювати остаточне поле "миль" поза конструктора.

Код:

class Car
{
    final miles = 0

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

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

}

У книзі сказано, що я повинен змінювати милі у межах методу примірника drive , чи щось не так?

3
Я працюю через ту ж книгу і написав той же код і отримав цю проблему, спасибі за розміщення!
додано Автор ericraio, джерело

1 Відповіді

Я думаю, що вони мали на увазі (не впевнені в тому, що вони сказали, якщо ви перефразовуєте), що не існує методу сеттера, тому він не може бути змінений ззовні класу.

Воно є , однак, все ще є final властивістю, що означає, що воно не може бути змінене після того, як його набір, який буде в конструкторі або під час оголошення.

Правила власності та поля

Проте, перегляньте ці дві проблеми: 1628 , 2752 , тому може знадобитися більше досліджень, хоча це обмежується властивостями локального сценарію.

My guess is you're using a 1.7+ Groovy, while the book targets <= 1.6.

Див. Також це запитання SO .

2
додано
я можу заявити щось подібне: def final miles ?
додано Автор ProfessionalAmateur, джерело
Це питання, яке ви посилаєтеся, говорить про ту саму книгу та розділ, у якому я є. Схоже, книга була написана для <1.6 і Im використовуючи 1.8, щоб грати з.
додано Автор ProfessionalAmateur, джерело
@ProfessionalAmateur Yep; вони його виправили (хоча це тривало рік-два!)
додано Автор Dave Newton, джерело