Использование внутренних классов в Java - перечисление

У меня очень специфическая проблема, связанная с внутренним классом. Позвольте мне показать вам пример кода:

class Foo {
    MYOPTIONS temp;

    public static enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

Итак, это перечисление находится внутри класса Foo. Теперь, что я хочу сделать, установите временную переменную как один из трех параметров, но сделайте это за пределами класса Foo, скажем, из класса External. К сожалению, у меня не может быть метода set, потому что External.setTemp (MYOPTIONS.OPTION1) недействителен, поскольку перечисление не отображается в классе external. Поэтому единственное, что я мог придумать, - это три метода в классе Foo:

public void setTempOption1 () {this.temp=MYOPTIONS.OPTION1;}
public void setTempOption2 () {this.temp=MYOPTIONS.OPTION2;}
public void setTempOption3 () {this.temp=MYOPTIONS.OPTION3;}

Очевидно, что другой вариант - изменить перечисление и не иметь его как внутренний класс. Есть ли другие варианты, которые мне не хватает? Благодаря

Ответ 1

class ContainsInnerEnum {
    MYOPTIONS temp;

    public enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

class EnumTester {
    public void test () {
        ContainsInnerEnum ie = new ContainsInnerEnum ();
        // fail:
        // ie.temp = MYOPTIONS.OPTION1;
        // works:
        ie.temp = ContainsInnerEnum.MYOPTIONS.OPTION1;
    }       
}

Полное имя MYOPTIONS содержит имя класса внедрения.

Ответ 2

Объявление действительно, но вы должны использовать его следующим образом:

Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1

Вам не хватает имени класса, когда вы используете "enum".

Ответ 3

Вы можете сделать это следующим образом:

Foo f = ...;
f.temp = Foo.MYOPTIONS.OPTION1;

Хотя я также рекомендовал бы экстернализировать MYOPTIONS.

Ответ 4

При использовании MYPOTIONS перечисления:

вы должны обратиться к Foo
public class Uta {
    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.temp = Foo.MYOPTIONS.OPTION1;
    }
}

Предполагая, что класс Foo находится в пакете Foo (вы всегда должны организовывать классы в пакетах), то вы также можете использовать статический импорт, чтобы сделать ваш код немного чище:

package foo;

import static foo.Foo.MYOPTIONS.OPTION1;

public class Uta {
    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.temp = OPTION1;
    }
}

Ответ 5

Внутренне каждая константа enum возвращает объект типа enum; (т.е. Foo.MYOPTIONS.OPTION1 возвращает объект типа MYOPTIONS), поэтому мы не можем сделать нашу собственную реализацию (т.е. New Foo.MYOPTIONS(); не разрешено создавать объект enum явно из-за num сам предоставь объект)

Итак, если мы хотим напечатать ссылочную переменную по умолчанию .toString(); метод будет вызван. В перечислении toString(); метод overidden и его возвращаемое имя константы. так что мы можем иметь как Object, так и константу enum одной строкой (т.е. Foo.MYOPTIONS.OPTION1) Пример:

    class Foo {
        MYOPTIONS temp;

        public static enum MYOPTIONS {
            OPTION1, OPTION2, OPTION3;
        } 
    }

public class Main
{
    public static void main(String[] args) {
        Foo foo=new Foo();
        foo.temp = Foo.MYOPTIONS.OPTION1;
        System.out.println(foo.temp);
    }
}

что это, если вы напишите эту строку, чтобы явно создать экземпляр объекта enum

(foo.temp = new Foo.MYOPTIONS();)

enter code here

вы можете получить ошибку времени компиляции как: -

ошибка: типы перечислений не могут быть созданы