Статический контекст в перечислимом определении

обнаружил, что проблема отлично работает с python 3.5. Кажется, в python 3.6 есть ошибка, которая выдает ошибку cffi-backend при использовании с netmiko

11
задан Jonik 24 February 2009 в 13:17
поделиться

5 ответов

Сообщение об ошибке вводит в заблуждение, просто сделайте helper защищенный и это будет работать.

protected void helper(){
    // can be called from subclasses (such as FOO) since it is not private
}
8
ответ дан 3 December 2019 в 08:31
поделиться

Что-то вроде этого охвачено в книге Трудных вопросов Java. IIRC, на внешний контекст класса всегда смотрят перед суперклассом. В этом случае найден помощник. Но мы создаем значение в статическом контексте (существует эффективно a private static final прежде FOO). Следовательно ошибка.

Попробовать super.helper();.

3
ответ дан 3 December 2019 в 08:31
поделиться

Если я переведу Ваше перечисление в его структуру класса, то оно будет приблизительно походить на это:

public abstract class TestEnum {

  public static final TestEnum FOO = new FOO("foo") {
    public void foo() {
        helper();  // <- compiler error
    }
 };

  String name;
  TestEnum(String name) {
      this.name = name;
  }

  public abstract void foo();

  private void helper(){
    // do stuff (using this.name, so must not be static)
  }

}

НЕЧТО экземпляра является anynomous классом, который расширяет TestEnum. Вот почему я полагаю, что Вы не можете получить доступ к помощнику (), потому что это является частным. Так this.helper (), вероятно, не должен работать. Я не уверен, почему даже super.helper () работы, но возможно перечисление предоставляет Вам частный доступ к родителю.

Что касается статической ошибки контекста, я соглашаюсь, что сообщение об ошибке, кажется, не имеет смысл.

2
ответ дан 3 December 2019 в 08:31
поделиться

Существует статья, упоминая эту проблему, к сожалению, это находится на немецком языке. Возможно, можно все еще извлечь некоторую полезную информацию.

Править: Кажется, несколько другая проблема от Вашего. Я все еще не понимаю поведения Вашего примера, который я также вижу здесь.

0
ответ дан 3 December 2019 в 08:31
поделиться

Вы можете рассматривать каждую константу перечисления как единственный экземпляр подкласса класса перечисления. Как и в случае с «обычными» классами, «подклассы» перечисления не могут получить доступ к закрытым членам перечисления «суперкласс». (Я не могу воссоздать обходной путь "this.", О котором вы упоминаете.)

Разумным решением является изменить доступ к методу с private на protected чтобы предоставить доступ к "подклассам" константы перечисления.

Лучшее предложение заголовка вопроса: "Java private enum method?" или просто "метод частного перечисления" (пусть тег Java позаботится о Java-ности)

1
ответ дан 3 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: