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

时间:2014-10-21 14:02:03

标签: java enums pmd

我有一个包含Java内部类的枚举类。

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

public enum MyEnum{
  VALUE_1,
  VALUE_2;

  private static class MyInnerClass // is static here needed or can it be removed?
  { 
  }
}

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

注意:This question不是重复的,它与我在这里要求的相反。

1 个答案:

答案 0 :(得分: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");
            }
        }
    }
}

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

new MyEnum.MyInnerClass(); // this will fail

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