Доступ к переменным суперкласса из перечисления

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

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 теперь должна быть установлена ​​на «Это мяч».

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


person Zippy    schedule 16.03.2015    source источник
comment
Хранить состояние в перечислении или иметь такую ​​возможность, делая его изменяемым, — очень плохая идея. Однако вы можете передать параметры в конструктор перечисления. Взгляните на пример Planet.   -  person David Ehrmann    schedule 16.03.2015


Ответы (2)


Вы можете сделать следующее, если хотите, чтобы MyClass.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;
        }
    }
}
person beresfordt    schedule 16.03.2015

Вложенный тип enum неявно статичен (см. Являются ли переменные перечисления java статическими?). Сюда входят enum типы, объявленные как внутренние классы, поэтому они не могут получить доступ к полям экземпляра внешнего класса.

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

person skaffman    schedule 16.03.2015
comment
поэтому они не могут получить доступ к полям-членам внешнего класса, если я правильно помню, они могут, но им нужен явный экземпляр внешнего класса, что-то вроде public void setValue(MyClass mc){ mc.someValue = "This is a ball";}. - person Pshemo; 17.03.2015
comment
Вы правы в том, что не можете устанавливать поля внешнего класса, но это исправляется выполнением enum ObjectType extends MyClass. - person David Ehrmann; 17.03.2015
comment
@SotiriosDelimanolis Возможно, вы правы, но это определенно может что-то implement. - person David Ehrmann; 17.03.2015
comment
@skaffman В своем комментарии к вопросу я сказал, что это, вероятно, неправильный вопрос. Это либо злоупотребление перечислением, либо правильное использование, но лучше использовать параметризованный конструктор перечисления. - person David Ehrmann; 17.03.2015