2014-10-21 2 views
7

У меня есть класс enum, который содержит внутренний класс в Java.Внутренние классы в enums всегда статичны в 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

Согласно JLS (http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.9),"Это ошибка времени компиляции, чтобы попытаться явно создать экземпляр тип перечисления ". Итак, я бы предположил, что статичность избыточна. – Tetramputechture

+1

JLS ссылается на нечто вроде 'new MyEnum()', а не на создание внутренних классов, объявленных внутри типа перечисления. –

ответ

6

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.

Смежные вопросы