我有一个非常具体的问题,与内部类有关。让我给你看一些示例代码:
class Foo {
MYOPTIONS temp;
public static enum MYOPTIONS {
OPTION1, OPTION2, OPTION3;
}
}
所以这个枚举在Foo类中。现在我要做的是将temp变量设置为三个选项之一,但是在类Foo之外执行,比如说来自一个名为External的类。不幸的是我没有set方法来执行此操作,因为External.setTemp (MYOPTIONS.OPTION1)
无效,因为枚举在类外部不可见。
所以我唯一能想到的就是在Foo类中有三个方法:
public void setTempOption1 () {this.temp=MYOPTIONS.OPTION1;}
public void setTempOption2 () {this.temp=MYOPTIONS.OPTION2;}
public void setTempOption3 () {this.temp=MYOPTIONS.OPTION3;}
显然,另一种选择是更改枚举,而不是将其作为内部类。 我还缺少其他选择吗? 感谢
答案 0 :(得分:22)
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的全名包含嵌入类名。
答案 1 :(得分:2)
声明有效,但您必须以这种方式使用它:
Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1
使用“枚举”时,您缺少类的名称。
答案 2 :(得分:1)
你可以这样做:
Foo f = ...;
f.temp = Foo.MYOPTIONS.OPTION1;
虽然我也建议外部化MYOPTIONS
。
答案 3 :(得分:1)
使用Foo
枚举时,您必须引用MYPOTIONS
:
public class Uta {
public static void main(String[] args) {
Foo foo = new Foo();
foo.temp = Foo.MYOPTIONS.OPTION1;
}
}
假设课程Foo
在foo
包中(您应该始终组织classes in packages),那么您也可以使用static imports,让您的代码更清洁一点:
package foo;
import static foo.Foo.MYOPTIONS.OPTION1;
public class Uta {
public static void main(String[] args) {
Foo foo = new Foo();
foo.temp = OPTION1;
}
}
答案 4 :(得分:0)
内部每个枚举常量都返回枚举类型的对象;(即Foo.MYOPTIONS.OPTION1返回类型MYOPTIONS的对象),因此我们无法进行实例化(即新建Foo.MYOPTIONS();不允许显式创建枚举对象) num的becoz本身提供了对象)
因此,如果我们要默认打印参考变量。方法将被调用。在枚举中toString(); mehod覆盖并且返回常量的名称。所以我们可以将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);
}
}
就是这样,如果您编写此行以显式实例化枚举对象
(foo.temp =新的Foo.MYOPTIONS();)
enter code here
您可能会遇到编译时错误,例如:-
错误:枚举类型可能无法实例化