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?
Trả lời
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 enum
s
(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:.
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. –
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
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
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.
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
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
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
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();
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.
- 1. Có một enum với các loại MIME trong Java?
- 2. Các phương thức Java có thể trả về kiểu Enum không?
- 3. get() phương pháp trong Java enum loại
- 4. Phương thức Java gửi với đối số rỗng
- 5. ERROR Phương thức tĩnh yêu cầu cá thể rỗng, phương thức không tĩnh yêu cầu cá thể không rỗng
- 6. Không thể cụ thể với các kiểu trường chung Java như với các kiểu phương thức chung?
- 7. Gọi một phương pháp cụ thể dựa trên loại enum?
- 8. Có thể một enum java có nhiều hơn một hàm tạo không?
- 9. Tạo phương thức hashCode() - Java
- 10. Có thể tạo các Phương thức Mở rộng với Khung 2.0 không?
- 11. Tạo danh sách các phương thức của một lớp với các kiểu phương thức
- 12. Có cách nào tốt hơn để tạo chuỗi chuyển đổi chung thành phương thức enum hoặc mở rộng enum không?
- 13. Các kiểu trả về Java covariant không hoạt động đối với các phương thức ghi đè của một cá thể enum?
- 14. Java - Có thể xuất stacktrace với các chữ ký phương thức không?
- 15. Có tương đương với phương thức Java bằng C++ không?
- 16. Cách tạo các phương thức mở rộng cho các loại
- 17. Sử dụng các phương pháp chung, có thể lấy các loại khác nhau từ cùng một phương thức không?
- 18. Có thể gọi phương thức nội bộ từ một phương thức động trong .NET không?
- 19. Có thể lưu Loại (sử dụng "typeof()") trong enum không?
- 20. Có thể viết phương thức hoán đổi trong Java không?
- 21. Không thể tạo phương thức trợ giúp với rspec
- 22. Có một loại Java tích hợp đảm bảo phương thức thực thi (T t) không?
- 23. Tạo một phương thức đồng thời là một thể hiện và phương thức lớp
- 24. Java Enums: Hai loại enum, mỗi loại chứa tham chiếu với nhau?
- 25. Java: Enum tham số trong phương pháp
- 26. Phương thức kiểu nhà máy Enum
- 27. Có bắt được một phương thức trong java không?
- 28. Có thể Automapper bỏ qua các phương thức void không?
- 29. Làm thế nào để có được tất cả các giá trị có thể có của một enum trong java? (không biết Enum cụ thể)
- 30. Làm thế nào để tạo một giao thức với các phương thức không bắt buộc?
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
tại sao bạn muốn có một enum rỗng? – maasg
Ô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