在Java中使用内部类 - 枚举

时间:2012-04-28 10:09:09

标签: java enums inner-classes

我有一个非常具体的问题,与内部类有关。让我给你看一些示例代码:

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;}

显然,另一种选择是更改枚举,而不是将其作为内部类。 我还缺少其他选择吗? 感谢

5 个答案:

答案 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;
    }
}

假设课程Foofoo包中(您应该始终组织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

您可能会遇到编译时错误,例如:-

错误:枚举类型可能无法实例化