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);
}
}
}
答案 0 :(得分:17)
正如埃里克所说,枚举是隐含的。要执行您想要的操作,请添加一个调用callOuterMethod(OuterClass oc)
的{{1}}方法来执行您想要的操作:
oc.outerMethod(data)
答案 1 :(得分:7)
不能那样做。枚举是隐式静态的,即使你没有声明它。见类似问题/答案:
“嵌套枚举类型是隐式静态的。显式声明嵌套是允许的 枚举类型是静态的。“
答案 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);
}
}
}