Использование внутренних классов в 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
вы можете получить ошибку времени компиляции как: -
ошибка: типы перечислений не могут быть созданы