2014-10-21 16 views
7

Tôi có một lớp enum có chứa một lớp bên trong trong Java.Các lớp bên trong trong enums luôn tĩnh trong Java?

Ví dụ (Trong đoạn mã thực tế, có một số phương pháp khai báo trên enum rằng trong nội bộ sử dụng các lớp bên trong):

public enum MyEnum{ 
    VALUE_1, 
    VALUE_2; 

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

PMD nói với tôi rằng những sửa đổi 'tĩnh' là không cần thiết (Vi phạm quy tắc UnusedModifier). Đây có phải là chính xác hoặc nó sẽ là một lỗi PMD?

Lưu ý: This question không trùng lặp, đó là nghịch đảo của những gì tôi hỏi tại đây.

+1

Theo JLS (http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.9),"Đó là lỗi biên dịch thời gian để cố gắng khởi tạo nhanh một loại enum ". Vì vậy, tôi sẽ đoán tĩnh là dư thừa. – Tetramputechture

+1

JLS tham chiếu đến một cái gì đó như 'new MyEnum()', không để instantiating các lớp bên trong được khai báo bên trong kiểu enum. –

Trả lời

6

static từ khóa không phải là dư thừa. Bạn có thể tạo một lớp lồng nhau tĩnh (với từ khóa static) hoặc một lớp bên trong (không có nó). Trong trường hợp đầu tiên, lớp sẽ không được gán cho bất kỳ giá trị enum cụ thể nào. Trong trường hợp thứ hai, trường hợp của lớp bên trong cần phải có một thể hiện kèm theo - một trong những enum giá trị:

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"); 
      } 
     } 
    } 
} 

Trong ví dụ trên bạn không thể tạo một thể hiện của các MyInnerClass trực tiếp từ MyEnum:

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

Để thực hiện việc này, bạn cần có một lớp lồng nhau static, nhưng sau đó bạn không thể sử dụng thứ gì đó như MyEnum.this.

Các vấn đề liên quan