任务是用java实现漂亮的策略设计模式enum:
public enum MyEnum {
FIRST {
@Override
public String doIt() {
return "1: " + someField; //error
}
},
SECOND {
@Override
public String doIt() {
return "2: " + someField; //error
}
};
private String someField;
public abstract String doIt();
}
Run Code Online (Sandbox Code Playgroud)
但是在提到someField我的时候
无法对someField的非静态字段进行静态引用.
有什么不对,有可能做得更好吗?
在阅读这个问题时,我打开我的编辑器尝试一些代码示例来验证和理解它。以下是我的代码:
public enum EnumImpl {
B {
public void method() {
System.out.println(s); //(1)non-static variable s cannot be referenced from a static context
}
public static int b; //(2)Illegal static declaration in inner class
};
private int s;
}
Run Code Online (Sandbox Code Playgroud)
但是编译上面的代码让我更加困惑。
B实际上属于静态类。所以在 中method,它是一个静态上下文。嵌套的枚举类型是隐式静态的。
以下是B的匿名合成类的字节码:
final class enum_type.EnumImpl$1 extends enum_type.EnumImpl {
enum_type.EnumImpl$1(java.lang.String, int);
Code:
0: aload_0
1: aload_1
2: iload_2
3: aconst_null
4: invokespecial #1 // Method enum_type/EnumImpl."<init>":(Ljava/lang/String;ILenum_type/EnumImpl$1;)V
7: …Run Code Online (Sandbox Code Playgroud)