Java Optionallt;Tgt; questions, am I doing this right?(Java可选t;T问题,我这样做正确吗?)
问题描述
我有一个"坏习惯",当某些东西不存在时,我会把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()
Foundhere的文档,其中显示:
如果此可选参数中存在值,则返回该值,否则引发NoSuchElementException异常。
因此,我认为为了防止出现这种情况,我应该将getter包装在#isPresent()
中,但是我不知道如何返回空。
这是正确的做事方式吗,还是我错过了什么?我不是在寻找"解决办法",我是在寻找有关效率和适当实践的信息。
推荐答案
您需要问问自己,如果没有任何可返回的内容,您希望Getter做什么。
实际上只有四个选项:
- 返回空值(但随后返回到您试图避免的位置);
- 让您的getter返回
Optional<T>
而不是T
; - 如果未设置,则返回默认值;
- 引发异常。
我会选择2,除非对于缺省值应该是什么有一个非常明确的正确答案。只有当客户端代码应该总是知道是否有什么东西存在并且只有在有的时候才请求它时,4才是合适的(这将是不寻常的,但不是不可能的)。
这篇关于Java可选&t;T&>问题,我这样做正确吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java可选&t;T&>问题,我这样做正确吗?
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01