обнаружил, что проблема отлично работает с python 3.5. Кажется, в python 3.6 есть ошибка, которая выдает ошибку cffi-backend при использовании с netmiko
Сообщение об ошибке вводит в заблуждение, просто сделайте helper
защищенный и это будет работать.
protected void helper(){
// can be called from subclasses (such as FOO) since it is not private
}
Что-то вроде этого охвачено в книге Трудных вопросов Java. IIRC, на внешний контекст класса всегда смотрят перед суперклассом. В этом случае найден помощник. Но мы создаем значение в статическом контексте (существует эффективно a private static final
прежде FOO
). Следовательно ошибка.
Попробовать super.helper();
.
Если я переведу Ваше перечисление в его структуру класса, то оно будет приблизительно походить на это:
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 () работы, но возможно перечисление предоставляет Вам частный доступ к родителю.
Что касается статической ошибки контекста, я соглашаюсь, что сообщение об ошибке, кажется, не имеет смысл.
Существует статья, упоминая эту проблему, к сожалению, это находится на немецком языке. Возможно, можно все еще извлечь некоторую полезную информацию.
Править: Кажется, несколько другая проблема от Вашего. Я все еще не понимаю поведения Вашего примера, который я также вижу здесь.
Вы можете рассматривать каждую константу перечисления как единственный экземпляр подкласса класса перечисления. Как и в случае с «обычными» классами, «подклассы» перечисления не могут получить доступ к закрытым членам перечисления «суперкласс». (Я не могу воссоздать обходной путь "this.", О котором вы упоминаете.)
Разумным решением является изменить доступ к методу с private на protected чтобы предоставить доступ к "подклассам" константы перечисления.
Лучшее предложение заголовка вопроса: "Java private enum method?" или просто "метод частного перечисления" (пусть тег Java позаботится о Java-ности)