2013-11-11 2 views
6

Как я понял, внутренние перечисления всегда явно неявно статичны в java. Это означает, что я не могу получить доступ к полям экземпляра из моего внутреннего класса enum.Внутреннее перечисление в нестационарном контексте

public class InnerEnum { 
    private enum SomeInnerEnum { 
     VALUE1() { 
      @Override 
      public void doSomething() { 
       // ERROR: WON'T COMPILE 
       // Cannot make static reference 
       // to non-static field i 
       System.out.println(i); 
      } 
     }, 
     VALUE2() { 
      @Override 
      public void doSomething() { 
       // do something else with i 
      } 
     }; 

     public abstract void doSomething(); 
    } 

    private int i = 10; 
} 

Я нашел довольно удобным просто переопределить метод в каждой константе enum, поэтому я мог бы использовать его в своем внешнем классе. Это плохой стиль программирования в java, потому что это фактически запрещено?

Есть ли способ создать внутреннее перечисление с доступом к моим переменным экземпляра?

Заранее спасибо.

+1

передать 'this'' 'DoSomething()' для доступа 'i' – ZhongYu

+0

+1 Я даже не знал, что существуют внутренние перечисления. Я посмотрю, какая версия java была введена. – Mukus

+0

@TejaswiRana. В той же версии Java, в которой перечислены перечисления. – EJP

ответ

2

Есть ли способ создать внутреннее перечисление с доступом к моему экземпляру переменных?

enum это время компиляции конструкция (предопределено), и поэтому любые внешние данные внутри одного должны быть легко доступны для компилятора до выполнения.

Если вы явно не передаете переменную (или некоторую ссылку, содержащую ее, в вашем случае this) до метода внутри enum, вы не сможете ссылаться на нее.

1

Я нашел довольно удобным просто переопределить метод в каждой константе enum, поэтому я мог бы использовать его в своем внешнем классе. Это плохой стиль программирования в java, потому что это фактически запрещено?

Нет ничего изначально неправильного в переопределении методов в ваших константах перечисления. Как и в любой другой языковой конструкции, при неправильном использовании это не так уж плохо.

Я не уверен, что вы подразумеваете под «так что я мог бы использовать его в своем внешнем классе», но в общем случае перечисления не должны сильно зависеть от внешнего кода. Они предназначены для описания фиксированного набора постоянных значений, и для достижения этого требуется небольшая или никакая связь с другими типами (в отличие от основных типов, таких как примитивы и строки). Мне кажется сомнительным проектом для константы перечисления для доступа к внешнему типу экземпляра уровня.

Смежные вопросы