相关疑难解决方法(0)

如何通过重写方法在java枚举中使用字段?

任务是用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的非静态字段进行静态引用.

有什么不对,有可能做得更好吗?

java enums strategy-pattern

29
推荐指数
2
解决办法
5212
查看次数

嵌套枚举是静态的?

在阅读这个问题时,我打开我的编辑器尝试一些代码示例来验证和理解它。以下是我的代码:

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,它是一个静态上下文。
  • 相比之下,第二个错误说这是一个内部类——java doc所说的非静态嵌套类。
  • 以下是我从JLS引用的一行,但似乎有点混乱和模糊。

    嵌套的枚举类型是隐式静态的。

  • 以下是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)

java enums

6
推荐指数
1
解决办法
851
查看次数

标签 统计

enums ×2

java ×2

strategy-pattern ×1