Đặt tên enum trong Java: Số ít hay số nhiều?


184

Có một khuyến nghị "chính thức" nào về cách đặt tên cho enum Java không?

enum Protocol { HTTP, HTTPS, FTP }

hoặc là

enum Protocols { HTTP, HTTPS, FTP }

Tôi biết trong thế giới .Net, khuyến nghị là sử dụng số ít ngoại trừ các enum đại diện cho các cờ bit. Chỉ tò mò nếu có một cái gì đó tương tự trong Java.

Một câu hỏi liên quan có vẻ là .Net cụ thể: Số ít hoặc số nhiều cho liệt kê?


3
Bạn có thể tìm thấy câu trả lời ở đây . Enums là các lớp, có nghĩa là, bạn nên khai báo chúng theo cùng một cách.
bsiamionau

Câu trả lời:


220

Enums trong Java (và có lẽ là enums nói chung) nên là số ít. Suy nghĩ là bạn không chọn nhiều Giao thức, mà là một Giao thức gồm các lựa chọn có thể có trong danh sách các giá trị.

Lưu ý sự vắng mặt của số nhiều: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
Microsoft dường như có cùng quan điểm về lập trình .NET: stackoverflow.com/a/1336012/279112
Panzercrisis

Làm thế nào đến TimeUnit sử dụng số nhiều? ví dụ : DAYS, HOURS...
theyuv

4
Các giá trị là số nhiều, bản thân enum không phải là :-)
Calvin

21

Theo cùng một cách mà khi bạn đang xác định tên bảng trong cơ sở dữ liệu hoặc một lớp trong Java, bạn sử dụng số ít cho enums thì đó cũng là lựa chọn tốt nhất. Chỉ cần xem cách bạn sẽ sử dụng nó.

Hãy viết một ví dụ:

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

class Appointment {
private Day day;

public void setDay(Day day) {
    this.day = day;
}
}

Ở dạng số ít bạn thấy rõ ý định của thuộc tính day. "ngày" là ngày trong tuần cuộc hẹn này sẽ được tổ chức. Nếu không, chữ ký của phương thức sẽ được đặtDay (Ngày ngày) và chắc chắn nhiều người sẽ tự hỏi liệu cuộc hẹn có thể xảy ra trong hơn một ngày không.

Nếu bạn làm việc trong một công ty, có ca làm việc 48 giờ, bạn có thể cố gắng xác định một cái gì đó như:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Bằng cách đó bạn có thể thiết lập những ngày bạn sẽ đi làm. Nhưng nó vẫn trông lạ và có một lựa chọn tốt hơn và là sử dụng dạng số ít:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Bây giờ bạn thực sự đang thể hiện ý nghĩa của enum. Thông thường trong bất kỳ miền nào bạn sẽ thấy rằng sử dụng số ít cho enum là tùy chọn tốt nhất vì mỗi hằng số trong enum chỉ là một phần tử.

Bạn cũng đề cập đến .NET. Một "cờ" enum trong .NET chỉ có nghĩa là khi bạn đang mong đợi enum đó là một tham số những gì bạn thực sự nhận được là một danh sách các phần tử của enum đó (được lưu dưới dạng một số nguyên).

// Define an Enum with FlagsAttribute.
[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};

public void setMultiHue(MultiHue hues);

Bạn có thể làm tương tự trong Java, nhưng enum vẫn là số ít:

public enum Hue {
BLACK, RED, GREEN, BLUE;
private final Integer hue;

Hue() {
    this.hue = 1 << this.ordinal();
}

public Integer toFlag() {
    return this.hue;
}
}

public class MultiHue {
private Integer hues = 0;

public void addHue(Hue hue) {
    this.hues |= hue.toFlag();
}

public boolean hasHue(Hue hue) {
    return (this.hues & hue.toFlag()) != 0;
}
}

Một cách dễ dàng và rõ ràng hơn (mặc dù nó sử dụng nhiều bộ nhớ hơn) để làm điều này với Java chỉ là sử dụng Danh sách.


2
Trên thực tế, một cách tốt hơn để làm điều này sẽ là một Enumset đóng gói một Bitset và chăm sóc tất cả những thứ đó cho bạn. :-)
corsiKa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.