Непристойный доступ к частному полю для родителей / детей с закрытием - PullRequest
5 голосов
/ 04 июня 2009

В Groovy у меня есть родительский класс и дочерний класс, где конструктор родительского класса пытается установить значение поля родительского класса с помощью замыкания, как показано в следующем коде:

try {
  def x = new ChildClass()
} catch (ex) {
  ex.printStackTrace(System.err)
}

class ParentClass {
  private values = []

  ParentClass(columnCount) {
    columnCount.times { values.add('') }
  }
}

class ChildClass extends ParentClass {
  ChildClass() {
    super(20)
  }
}

Однако, когда я запускаю этот код, я получаю исключение groovy.lang.MissingPropertyException с сообщением «Нет такого свойства: значения для класса: ChildClass». Однако, если я изменю конструктор родительского класса, чтобы он не использовал замыкание с методом times, как в этом примере:

try {
  def x = new ChildClass()
} catch (ex) {
  ex.printStackTrace(System.err)
}

class ParentClass {
  private values = []

  ParentClass(columnCount) {
    def i
    for (i = 0; i < columnCount; i++) {
      values.add('')
    }
  }
}

class ChildClass extends ParentClass {
  ChildClass() {
    super(20)
  }
}

Это работает. Может кто-нибудь объяснить мне это поведение? Я не понимаю, почему Groovy считает, что поле значений является свойством дочернего класса. Я использую Groovy версию "Groovy Version: 1.6.3 JVM: 1.5.0_18".

1 Ответ

5 голосов
/ 05 июня 2009

Это известная ошибка в текущей версии groovy, предназначенная для исправления в groovy 2.0. См. GROOVY-3073 .

Это происходит из-за ошибки в метаклассе, когда замыкание в первом примере не может видеть переменную уровня закрытого класса.

Одним из возможных исправлений, решающих проблему в этой ситуации, является объявление локальной переменной-псевдонима в суперклассе, которая решает проблему ограничения в закрытии. Измените конструктор на это:

  ParentClass(columnCount) {
     def valueAlias = values
     columnCount.times { valueAlias.add('') }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...