我有一个“坏习惯”,就是在某些情况下会把null
传递进去,比如当某个东西不存在时可能会传递给枚举器。
例如:
private enum Foo {
NULL(1, null, 2),
NOT_NULL(3, new Bar(), 4);
private int a, c;
private Bar b;
Foo(int a, Bar b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
现在,我正在尝试将我的代码转换为使用Optional<T>
,就像大家建议的那样,但我不确定我是否做得正确。
这是我的代码(简化的枚举):
public static enum Difficulty {
EASY, MEDIUM, HARD
}
public static enum SlayerTasks {
NONE(0, Optional.empty(), Optional.empty(), Optional.empty()),
NPC(1, Optional.of(Difficulty.EASY), Optional.of("That one place."), Optional.of(1));
private int taskId;
private Optional<Difficulty> difficulty;
private Optional<String> location;
private Optional<Integer> npcId;
SlayerTasks(int taskId, Optional<Difficulty> difficulty, Optional<String> location, Optional<Integer> npcId) {
this.taskId = taskId;
this.difficulty = difficulty;
this.location = location;
this.npcId = npcId;
}
public int getTaskId() {
return taskId;
}
public Difficulty getDifficulty() {
return difficulty.get();
}
public String getLocation() {
return location.get();
}
public int getNpcId() {
return npcId.get();
}
}
我困扰于文档中有关
#get()
的内容,文档链接在这里,其中说明:
如果此Optional中存在值,则返回该值,否则抛出NoSuchElementException异常。
因此,我想通过将getter方法包装在#isPresent()
方法中来避免这种情况,但是我无法找到如何返回空值。
请问这样做是正确的方法吗?还是我漏掉了什么?我不是要“修复”,而是要了解效率和正确的实践方法。