Được:
public enum PersonType {
COOL_GUY(1),
JERK(2);
private final int typeId;
private PersonType(int typeId) {
this.typeId = typeId;
}
public final int getTypeId() {
return typeId;
}
public static PersonType findByTypeId(int typeId) {
for (PersonType type : values()) {
if (type.typeId == typeId) {
return type;
}
}
return null;
}
}
Đối với tôi, điều này thường phù hợp với bảng tra cứu trong cơ sở dữ liệu (chỉ dành cho các bảng hiếm khi được cập nhật).
Tuy nhiên, khi tôi cố gắng sử dụng findByTypeId
trong câu lệnh chuyển đổi (từ, rất có thể, đầu vào của người dùng) ...
int userInput = 3;
PersonType personType = PersonType.findByTypeId(userInput);
switch(personType) {
case COOL_GUY:
// Do things only a cool guy would do.
break;
case JERK:
// Push back. Don't enable him.
break;
default:
// I don't know or care what to do with this mess.
}
... như những người khác đã nêu, điều này dẫn đến một NPE @ switch(personType) {
. Một cách giải quyết (nghĩa là "giải pháp") tôi bắt đầu thực hiện là thêm một UNKNOWN(-1)
loại.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Bây giờ, bạn không phải thực hiện kiểm tra null nơi nó được tính và bạn có thể chọn hoặc không xử lý UNKNOWN
các loại. (LƯU Ý: -1
là một định danh không có khả năng trong kịch bản kinh doanh, nhưng rõ ràng chọn một cái gì đó có ý nghĩa cho trường hợp sử dụng của bạn).