枚举中的内部类在Java中是否始终是静态的?

Wim*_*uwe 10 java enums pmd

我有一个枚举类,其中包含Java中的内部类.

例如(在实际代码中,在内部使用内部类的枚举上声明了一些方法):

public enum MyEnum{
  VALUE_1,
  VALUE_2;

  private static class MyInnerClass // is static here needed or can it be removed?
  { 
  }
}
Run Code Online (Sandbox Code Playgroud)

PMD告诉我不需要'static'修饰符(违反UnusedModifier规则).这是正确的还是PMD错误?

注意:这个问题不重复,这与我在这里要求的相反.

Tom*_*wek 8

static关键字不是多余的.您可以创建静态嵌套类(使用static关键字)或内部类(不使用它).在第一种情况下,不会将类分配给任何特定的枚举值.在第二种情况下,内部类的实例需要有一个封闭的实例 - 其中一个enum值:

public class Test {
    public static void main(String[] args) {
        MyEnum.VALUE_1.createInnerObject().showName();
        MyEnum.VALUE_2.createInnerObject().showName();
    }

    public enum MyEnum {
        VALUE_1, VALUE_2;

        public MyInnerClass createInnerObject() {
            return new MyInnerClass();
        }

        private class MyInnerClass {
            public void showName() {
                System.out.println("Inner class assigned to " + MyEnum.this + " instance");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您无法MyInnerClass直接从以下位置创建实例MyEnum:

new MyEnum.MyInnerClass(); // this will fail
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,你需要有一个static嵌套类,但是你不能使用类似的东西MyEnum.this.