2011-09-06 41 views
9

Tôi có thể tạo một loại enum Java trống, nhưng khi tôi muốn thêm một số phương pháp: tôi nhận được một "lỗi cú pháp" (vào Eclipse). Tôi không tìm thấy tài liệu chính thức về điều này, vì vậy câu hỏi của tôi là: nó chỉ là không thể (vì vậy mà nó được đề cập rõ ràng ở đâu?) Hoặc là nó chỉ là trình biên dịch đó là sai?Có thể tạo một loại enum Java rỗng với các phương thức không?

+0

nếu bạn đăng mã đã đưa ra lỗi, chúng tôi sẽ có thể đưa ra câu trả lời phức tạp hơn. – tb189

+3

tại sao bạn muốn có một enum rỗng? – maasg

+0

Ông có thể muốn tạo một tập hợp của Enum đó trong thời gian chạy, nhưng vẫn có các hành vi cá thể. – ggb667

Trả lời

16

Có thể. Bạn chỉ cần thêm một ; chấm dứt (trống) danh sách các hằng enum:

enum TestEnum { 
    ;       // doesn't compile without this. 
    public void hello() { 
     System.out.println("Hello World"); 
    } 
} 

JLS Syntax Definition for enums

(Lưu ý rằng nếu không có bất kỳ trường hợp, bạn sẽ chỉ có thể gọi cho static phương pháp của enum)

liên quan:.

+0

Phương thức hello sẽ không thể gọi, phải không? Tôi không thấy điểm của một công trình như vậy. –

+0

Vì nó đứng có. Có lẽ phương pháp của anh ta là 'tĩnh', tôi không biết. Nhưng có, tôi đồng ý với bạn. Nó có vẻ hơi khó xử. – aioobe

+3

Cảm ơn @aioobe vì đã trả lời và liên kết. Tôi muốn làm điều này bởi vì tôi nghĩ rằng đó là một cách tự nhiên, và rất dễ hiểu/dễ hiểu để thực hiện một lớp phi instanciable (thường là một lớp tiện ích chỉ với các phương thức tĩnh bởi defintion): lớp phi instanciable là một enum không có phần tử "(tức là cho phép không sử dụng instance của chính nó) hơn là nói" nó nên được thực hiện với một constructor riêng ném một AssertionError "(xem Effective Java # 4). Nhưng đó chỉ là quan điểm của tôi, vì vậy đừng ngần ngại thách thức tôi nếu tôi sai ... – cedric

5

Vâng, đó là:

Bạn cần phải thêm một dấu chấm phẩy (;) để chấm dứt danh sách trống enums.
này biên dịch:

public enum MyEnum { 
    ; 
    public void method() { 

    } 
} 

Mặc dù tôi không thể nghĩ ra những gì nó sẽ hữu ích cho.

+1

Phương pháp có thể hữu ích, khi enums được nói bao gồm các lĩnh vực .. vì vậy nói u có một MÀU enum trong đó có một đại diện int, đại diện chuỗi ngắn cũng như một đại diện chuỗi hiển thị .. sau đó enum này có thể có phương pháp như getInteger(), getShortString(), getDisplayString() .. vì vậy ví dụ nó được hiển thị trên GUI bằng cách sử dụng tùy chọn getDisplayString() ... có thể được lưu trữ trong DB bằng cách sử dụng tùy chọn getShortString() ... – Scorpion

+2

Tôi nghĩ ý nghĩa của Bohemian là anh ta không thể nghĩ ra bất cứ điều gì hữu ích với một enum * trống rỗng với các phương pháp. – aioobe

+1

Có - mọi phương pháp thể hiện như vậy sẽ không thể truy cập được. Hơn nữa, tôi không thể nghĩ ra nhiều việc hữu ích để làm với một enum rỗng. – Bohemian

1

Absoulely,

/** 
* @author The Elite Gentleman 
* @since 06 September 2011 
* 
*/ 
public enum ExampleEnum { 
    WHAT_ENUM 
    ; 

    public void doOperation() { 

    } 
} 

Sau đó:

ExampleEnum exEnum = ExampleEnum.WHAT_ENUM; 
exEnum.doOperation(); 
6

Tất nhiên bạn có thể! "Ia! Ia! Cthulhu Fthagn! Ph'nglui mglw'nfah Cthulhu R'lyeh wgah'nagl fhtagn !!"

ý tưởng ban đầu: "http://www.theserverside.com/news/thread.tss?thread_id=50190"

Phá hủy thực tế có nguy cơ của riêng bạn.

import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

enum ThingsThatShouldNotBe { 
; 
public void HelloWorld() { 
    System.out.println(this.name() + " Says Hello!"); 
} 
public static void main(String[] args) throws Exception { 
    Constructor<?> con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0]; 
    Method[] methods = con.getClass().getDeclaredMethods(); 
    for (Method m : methods) { 
     if (m.getName().equals("acquireConstructorAccessor")) { 
      m.setAccessible(true); 
      m.invoke(con, new Object[0]); 
     } 
    } 
    Field[] fields = con.getClass().getDeclaredFields(); 
    Object ca = null; 
    for (Field f : fields) { 
     if (f.getName().equals("constructorAccessor")) { 
      f.setAccessible(true); 
      ca = f.get(con); 
     } 
    } 
    Method m = ca.getClass().getMethod("newInstance", 
     new Class[] { Object[].class }); 
    m.setAccessible(true); 
    ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu", 
      Integer.MAX_VALUE } }); 
    System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal()); 
    System.out.println("Say hello Cthulhu!"); 
    v.HelloWorld(); 
} 
} 

Mwu HA HA HA HA HA HA.

Nếu bạn thực sự cần một Enum và bạn muốn nó có phương pháp thể hiện, và bạn đã quyết định triệu hồi các vị thần phản chiếu để ép buộc sự ghê tởm này trên thế giới, thì đó là hữu ích.

Điều này chắc chắn sẽ gây nhầm lẫn cho các nhà phát triển khác sau này.

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