从内部嵌套枚举访问外部类

时间:2011-12-10 16:34:30

标签: java android scope closures inner-classes

有办法进入外面吗?

public class OuterClass  {
    String data;

    public void outerMethod(String data) {
         this.data = data;
    }

    public enum InnerEnum {
        OPTION1("someData"),
        OPTION2("otherData");

        InnerEnum(String data) {
              // Does not work:             
              OuterClass.this.outerMethod(data);
        }
    }
}

3 个答案:

答案 0 :(得分:17)

正如埃里克所说,枚举是隐含的。要执行您想要的操作,请添加一个调用callOuterMethod(OuterClass oc)的{​​{1}}方法来执行您想要的操作:

oc.outerMethod(data)

答案 1 :(得分:7)

不能那样做。枚举是隐式静态的,即使你没有声明它。见类似问题/答案:

“嵌套枚举类型是隐式静态的。显式声明嵌套是允许的 枚举类型是静态的。“

In Java, are enum types inside a class static?

答案 2 :(得分:4)

我相信你会将对象实例与类型混淆。你声明的是两种嵌套类型。这与两个嵌套对象实例不同。

使用类型操作时,关键字this没有意义。它只在处理对象实例时具有意义。因此,如果您尝试从内部类型调用外部类型的实例方法,则需要引用外部类型的实例。

但是,如果将外部类型的方法设置为static,则可以从嵌套类型调用静态方法,而无需引用外部类型的实例。请记住,如果这样做,该方法“对所有实例都相同” - 意味着它与OuterClass的所有实例共享任何状态 - 因此它只能访问该类型的静态成员。

在下面的示例中,outerMethod被声明为static,因此可以从嵌套类型调用它,而无需引用OuterClass实例。但是,通过这样做,它无法再访问私有实例成员data(当然没有引用实例)。您可以声明一个静态成员staticData并改为访问它,但请记住,该成员将由所有OuterClass实例以及outerMethod的所有invokations共享。

public class OuterClass  {

        String data;                 // instance member - can not be accessed from static methods
                                     //   without a reference to an instance of OuterClass

        static String staticData;    // shared by all instances of OuterClass, and subsequently
                                     //   by all invocations of outerMethod

        // By making this method static you can invoke it from the nested type 
        //  without needing a reference to an instance of OuterClass. However, you can
        //  no longer use `this` inside the method now because it's a static method of
        //  the type OuterClass
    public static void outerMethod(String data) {

            //this.data = data;  --- will not work anymore

            // could use a static field instead (shared by all instances)
            staticData = data;
    }

    public enum InnerEnum {
        OPTION1("someData"),
        OPTION2("otherData");

        InnerEnum(String data) {
                    // Calling the static method on the outer type
                    OuterClass.outerMethod(data);
        }
    }
}