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.