Diberikan:
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;
}
}
Bagi saya, ini biasanya selaras dengan tabel pencarian dalam database (hanya untuk tabel yang jarang diperbarui).
Namun, ketika saya mencoba untuk menggunakan findByTypeId
dalam pernyataan switch (dari, kemungkinan besar, input pengguna) ...
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.
}
... seperti yang telah dinyatakan orang lain, ini menghasilkan NPE @ switch(personType) {
. Satu solusi (yaitu, "solusi") yang saya mulai terapkan adalah menambahkan sebuah UNKNOWN(-1)
tipe.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Sekarang, Anda tidak perlu melakukan pemeriksaan nol di mana ia penting dan Anda dapat memilih untuk, atau tidak, menangani UNKNOWN
jenis. (CATATAN: -1
adalah pengidentifikasi yang tidak mungkin dalam skenario bisnis, tetapi jelas memilih sesuatu yang masuk akal untuk kasus penggunaan Anda).