2012-07-09 33 views
10

Sau khi đọc một số câu hỏi và câu trả lời về enum Tôi không thấy nó thực sự hữu ích ...Enum hữu ích cho việc gì?

Đó là một cái gì đó giữa lớp và một biến nhưng tôi biết nơi tôi có thể sử dụng nó để nó sẽ hữu ích hơn sau đó một lớp học, hoặc một vài biến chẳng hạn.

+6

http://stackoverflow.com/questions/481068/when-to-use-enum-or-collection-in-java – Habib

+1

http://stackoverflow.com/questions/2077634/enum-in-java-advantages – assylias

Trả lời

32

Có những thứ khác bạn có thể làm và lý do để sử dụng chúng, nhưng lý do chính tôi sử dụng enums là ngăn chặn khả năng tham số không hợp lệ. Ví dụ, hãy tưởng tượng phương pháp sau:

public void doSomethingWithAMonth(int monthNum); 

Đây không phải là chỉ mơ hồ (? Làm chỉ số tháng bắt đầu từ 1, hoặc ở mức 0), nhưng bạn có thể cung cấp dữ liệu không hợp lệ xuống bên phải (13+, số âm) . Nếu bạn có một enum Month với Jan, Feb, vv các chữ ký trở thành:

public void doSomethignWithAMonth(Month month); 

Mã gọi phương pháp này sẽ là xa dễ đọc hơn, và không thể cung cấp dữ liệu không hợp lệ.

+1

Cảm ơn! Bây giờ tôi nghĩ rằng tôi hiểu nó tốt hơn một chút :) –

+1

Đó là một ví dụ đơn giản và tốt – njfife

2

Khi đi từ tên "enum", nó là lý tưởng cho các hằng số liệt kê, cung cấp chức năng mở rộng. Ví dụ, bạn có thể lưu trữ một số hằng số bao gồm từ một vài tham số như: constantId, constanNameString, các tham số bổ sung. Ngoài ra enum có thể chứa các hàm.

Một sử dụng kỳ lạ của enum là để làm cho một singleton.

4

An enum buộc các lập trình viên phải chọn từ danh sách các thực thể hoặc khái niệm được xác định trước. Trong khi bạn có thể đạt được mục tiêu tương tự với các lớp hoặc đặt một biến cho một giá trị cụ thể, một liệt kê ít bị lỗi hơn khi nó quảng cáo và thực thi một trình đơn mà từ đó người đặt giá trị có thể chọn.

4

An Enum hữu ích để ngăn người khác làm những việc mà họ không nên làm. Ví dụ: nếu tôi có:

public final static int WEATHER_SUNNY = 0; 
public final static int WEATHER_RAINY = 1; 
public final static int WEATHER_HAIL = 2; 

thì tôi có thể làm: MyClass.WEATHER_SUNNY + MyClass.WEATHER_HAIL không có ý nghĩa. Đó là lý do tại sao nó tốt hơn để có một thời tiết enum. Điều này làm cho mã dễ đọc hơn và không cho phép tổng hợp hai số nguyên thời tiết.

+0

Tôi không phải là một fan hâm mộ lớn của ví dụ này nếu chỉ vì lý do mà tôi cảm thấy nó khuyến khích tư duy hẹp hòi. Không có lý do gì mà các loại thời tiết khác nhau như thế này không thể chồng chéo lên nhau, trên thực tế, chúng thường xuyên làm. – Thor84no

+0

@ Thor84no: cảm ơn nhận xét của bạn. Tuy nhiên, tất cả điều này phụ thuộc vào miền và ứng dụng để nói những điều như "khuyến khích tư duy hẹp hòi". dường như không thích hợp. –

10

Tôi sử dụng Enums cho bất kỳ thứ gì có nhiều "thay đổi" kiểu gì đó. tức là các ngày trong tuần.

Tại sao tôi không sử dụng String trong trường hợp này là vì tôi không thể thực hiện câu lệnh chuyển đổi trên chuỗi và tôi có thể bật Enum để mỗi ngày trong tuần tôi có thể làm điều gì đó cụ thể.

tôi cũng sử dụng Enum khi làm việc với Singleton pattern, Kiểm tra Effective Java book CH2(CHAPTER 2 CREATING AND DESTROYING OBJECTS), quote:

"Trong khi phương pháp này vẫn chưa được rộng rãi thông qua, một kiểu enum-yếu tố duy nhất là cách tốt nhất để thực hiện một singleton . " sẽ không dán mã đọc cuốn sách tuyệt vời.

Nếu tôi là bạn trước tiên tôi sẽ đọc Thinking in java chương Các loại được liệt kê. Sau đó, sau đó chương Java hiệu quả 6 và bạn nên là tốt

2

Enum là hữu ích khi bạn có một danh sách các giá trị có chức năng quan trọng và hữu hạn.

Nói cho ví dụ bạn cần sử dụng một ngày trong tuần: một ngày khác sẽ không được thêm vào và bạn muốn có ngày.MONDAY trong mã của bạn thay vì một số và phải nhớ rằng 0 là thứ hai, 1 là thứ ba và cứ tiếp tục như vậy. Nó làm cho chuyển đổi tuyên bố dễ hiểu quá, với:

Switch(day) { 
    case Monday : ... break; 
    case Tuesday : ... break 
    etc. 
} 
3

tôi sẽ thêm vào câu trả lời khác mà đếm được các lớp chỉ có một số lần cố định. Những trường hợp này có thể có các trường và phương thức, và được sử dụng như bất kỳ đối tượng Java nào khác. Ví dụ, Month enum có thể xác định phương pháp như

public int getNumberOfDays(int year); 
public boolean isFirstOfYear(); 
7

đơn giản Definition - An enum is just like any other class, with a predefined set of instances.

phần tốt nhất của enum là nó có thể được sử dụng trong báo cáo chuyển đổi mà chúng ta không thể sử dụng Strings.

và Enum là loại an toàn để bạn không thể chỉ định giá trị mới tại thời gian chạy.

+1

Chỉ với bất kỳ ai gặp vấn đề này, như của Java 7, không còn đúng là bạn không thể sử dụng câu lệnh 'String' trong 'switch'. http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html – Thor84no

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