2012-02-14 43 views
17

Tôi đang cố gắng tạo biến cuối cùng tĩnh riêng tư bên trong một enum, nhưng tôi vẫn nhận được một lỗi biên dịch. Có ai biết làm thế nào để sửa lỗi này?Biến cố định tĩnh cuối cùng bên trong một enum

Multiple markers at this line

  • Syntax error, insert "Identifier" to complete EnumConstantHeaderName
  • Syntax error, insert "}" to complete EnumBody
class Foo { 
    ... 

    public enum MyEnum { 
    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor";  

    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 

Trả lời

20

Các hằng enum cần phải là yếu tố đầu tiên trong Enumeration. Một phiên bản của mã của bạn mà biên dịch:

class Foo { 

    public enum MyEnum { 
     MyEnumType, MyEnumType2; 

     public String bar() { 
      return MY_STRING; 
     } 

     public String bar2() { 
      return MY_STRING + "2"; 
     } 

     private static final String MY_STRING = "a string I reuse in the enum"; 
    } 
} 

* EDIT *

Dựa tắt chỉnh sửa làm cho câu hỏi ban đầu của bạn, tôi thấy những gì bạn đang cố gắng làm. Không, không thể sử dụng các hằng số trong các khai báo enum của bạn được khai báo trong chính định nghĩa enum. Điều này là do các khai báo theo nghĩa đen phải là các phần tử đầu tiên trong enum. Điều này được bắt buộc bởi Đặc tả Ngôn ngữ Java. Hai điều nhanh chóng mặc dù:

  1. Bạn đang sử dụng private static final Strings. Điều này mang lại cho bạn hoàn toàn không có lợi ích gì hơn việc sử dụng các chuỗi ký tự thay thế, sẽ giải quyết được vấn đề.
  2. Nếu bạn muốn khai báo các hằng số có thể sử dụng lại (public static final Strings) thì bạn cần phải làm như vậy bên ngoài của enum.

Hoặc bạn có thể tuyên bố Enums của bạn như các yếu tố lồng nhau của một lớp trong đó xác định private static final String 's cho bạn.

Một số giả:

public class Foo { 
    public static enum MyEnum { 
     MyEnumType(0, MY_STRING), MyEnumType2(1, "Hello"); 

     private int ordinal; 
     private String value; 

     MyEnum(int ordinal, String value) { 
      this.ordinal = ordinal; 
      this.value = value; 
     } 

     public int getOrdinal() { 
      return ordinal; 
     } 

     public String getValue() { 
      return value; 
     } 

     public void setOrdinal(int ordinal) { 
      this.ordinal = ordinal; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 
    } 

    private static final String MY_STRING = "a string I reuse in the enum"; 
} 
+0

Công ước nói để đặt trường của bạn về phương pháp của bạn. –

+1

Tôi thực sự đang sử dụng các chuỗi trong hàm tạo. – will

+0

Tom - Bạn có ý gì khi "đặt trường của bạn về phương pháp của bạn"? – will

6

Giao diện có thể được sử dụng:

class Foo { 
    ... 

    private interface MyEnumConstants { 
    static final String MY_STRING = "a string I use in a constructor"; 
    static final String MY_OTHER_STRING = "a string I use in another constructor";  
    } 

    public enum MyEnum implements MyEnumConstants { 
    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 
+1

Bạn có thể lồng giao diện bên trong enum nếu bạn không muốn phải chứa cả hai bên trong một lớp khác. – MithrilTuxedo

19

Có thể, bạn chỉ cần phải trực tiếp tham khảo các biến.

class Foo { 
    ... 

    public enum MyEnum { 

    MyEnumType(1, MyEnum.MY_STRING), 
    MyEnumType2(2, MyEnum.MY_STRING), 
    MyEnumType3(3, MyEnum.MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 

    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor"; 
    } 
... 
} 
+0

Tuyệt vời! (và kỳ lạ) – TWiStErRob

+1

Tôi đang nhận được một tham chiếu về phía trước bất hợp pháp với điều này, nhưng tôi đang đi qua trong mẫu biên dịch thay thế. Một giao diện lồng nhau trong enum đã làm các trick mặc dù. – MithrilTuxedo

+0

Dường như biên dịch (kỳ quặc) nhưng sau đó trong thời gian chạy, tôi nhận được 'java.lang.NoClassDefFoundError: Không thể khởi tạo lớp' – qwertzguy

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