gpt4 book ai didi

Java Optional 问题,我这样做对吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:34 25 4
gpt4 key购买 nike

我有一个折腾的“坏习惯”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() 的文档找到 here它指出:

If a value is present in this Optional, returns the value, otherwise throws NoSuchElementException.

所以,我认为为了防止这种情况,我会将 getter 包装在 #isPresent() 中,但后来我不知道如何返回空的。

这是做事的正确方法,还是我遗漏了什么?我不是在寻找“修复”,而是在寻找有关效率和正确做法的信息。

最佳答案

你需要问问自己,如果没有什么可返回的,你希望你的 getter 做什么。

实际上只有四个选项:

  1. 返回一个 null(但是你又回到了你试图避免的事情);
  2. 让你的 getter 返回一个 Optional<T>而不是 T ;
  3. 如果没有设置则返回一个默认值;
  4. 抛出异常。

我会选择 2,除非对于默认值应该有一个非常明确的正确答案。 4 仅在客户端代码应该始终知道那里是否有东西并且只在有东西时才询问它(这很不寻常,但并非不可能)的情况下才是合适的。

关于Java Optional<T> 问题,我这样做对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com