14

我有一个与内部类有关的非常具体的问题。让我向您展示一些示例代码:

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

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

4

5 回答 5

27
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 的全名包含嵌入类名称。

于 2012-04-28T10:19:20.663 回答
2

声明是有效的,但你必须以这种方式使用它:

Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1

当您使用“枚举”时,您缺少类的名称。

于 2012-04-28T10:24:38.067 回答
1

你可以这样做:

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

虽然我也建议外部化MYOPTIONS

于 2012-04-28T10:20:55.353 回答
1

Foo使用MYPOTIONS枚举时必须参考:

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;
    }
}
于 2012-04-28T10:21:51.467 回答
0

在内部,每个枚举常量都返回枚举类型的对象;(即 Foo.MYOPTIONS.OPTION1 返回类型为 MYOPTIONS 的对象),因此我们不能进行自己的实例化(即 new Foo.MYOPTIONS();不允许显式创建枚举对象,因为 num本身提供对象)

所以,如果我们想默认打印引用变量 .toString(); 方法将被调用。在枚举 toString(); 方法被覆盖并返回常量的名称。所以我们可以在一行中同时拥有 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 = new Foo.MYOPTIONS();)

enter code here

你会得到如下编译时错误:--

错误:枚举类型可能没有被实例化

于 2019-08-28T11:15:59.187 回答