2015-03-16 2 views
0

Есть ли способ установить переменную, содержащуюся в родительском/суперклассе enums из самого enum? (Ниже не компилируется, но показывает, что я пытаюсь добиться) ....Доступ к переменным суперкласса из перечисления

class MyClass{ 

    ObjectType type;   
    String someValue; 


    public void setType(ObjectType thisType){ 

     type = thisType; 

    } 

    enum ObjectType { 

     ball{ 
      @Override 
      public void setValue(){ 
       someValue = "This is a ball"; //Some value isn't accessible from here 
      } 
     }, 
     bat{ 
      @Override 
      public void setValue(){ 
       someValue = "This is a bat"; //Some value isn't accessible from here 
      } 
     }, 

     net{ 
      @Override 
      public void setValue(){ 
       someValue = "This is a net"; //Some value isn't accessible from here 
      } 
     }; 

     public abstract void setValue(); 
    } 

} 

Тогда что-то вроде этого:

MyClass myObject = new MyClass(); 
myObject.setType(ObjectType.ball); 

После выполнения выше, «SomeValue 'строка myObject теперь должна быть установлена ​​на «Это мяч».

Есть ли способ сделать это?

+0

Сохранение состояния в перечислении или наличие этой способности, заставляя его выглядеть изменчивым, является очень плохим идеей. Однако вы можете использовать параметры pass в конструкторе enum. Взгляните на пример [Planet] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

ответ

2

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

public class MyClass { 
    ObjectType type; 
    String someValue; 

    public void setType(ObjectType thisType) { 
     this.type = thisType; 
     this.someValue = thisType.getSomeValue(); 
    } 

    enum ObjectType { 
     ball ("This is a ball"), 
     bat ("This is a bat"), 
     net ("This is a net"); 

     private final String someValue; 

     ObjectType(String someValue) { 
      this.someValue = someValue; 
     } 

     public String getSomeValue() { 
      return someValue; 
     } 
    } 
} 
6

Вложенный тип enum неявно статичен (см. Are java enum variables static?). Это включает enum типы, объявленные как внутренние классы, поэтому они не могут обращаться к полям экземпляра внешнего класса.

Вы не можете делать то, что вы пытаетесь сделать с помощью enum, вам придется моделировать это как обычный класс.

+1

", поэтому они не могут получить доступ к полям-членам внешнего класса, если я правильно их помню, но им нужен явный экземпляр внешнего класса, что-то вроде' public void setValue (MyClass mc) {mc.someValue = "Это мяч ";}'. – Pshemo

+0

Вы правы, когда не можете задавать поля внешнего класса, но это исправлено с помощью 'enum ObjectType extends MyClass'. –

+5

@DavidEhrmann Тип 'enum' не может« расширять »что-либо. –

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