Java可选<t>问题,我这样做了吗?</t>

时间:2014-11-24 10:20:53

标签: java java-8 optional

我有一个&#34;坏习惯&#34;将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>,就像每个人都在暗示,但我不确定我是否正确地执行了此操作。

这是我的代码(Trimmed enum):

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的文档,其中指出:

  

如果此Optional中存在值,则返回该值,否则抛出NoSuchElementException。

所以,我认为为了防止这种情况,我会将吸气剂包裹在#isPresent()中,但后来我无法弄清楚如何返回空。

这是正确的做事方式,还是我错过了什么?我没有找到&#34;修复&#34;,我正在寻找有关效率和正确实践的信息。

3 个答案:

答案 0 :(得分:4)

如果没有任何回报,你需要问问自己你想让你的吸气者做什么。

实际上只有四种选择:

  1. 返回null(但之后你又回到了你想要避免的地方);
  2. 让你的getter返回Optional<T>而不是T;
  3. 如果没有设置任何内容,则返回默认值;
  4. 抛出异常。
  5. 除非对默认应该是什么,否则我会选择2。 4只有当客户代码应该始终知道那里是否存在某些内容并且只在有内容时才会询问(这将是不寻常的,尽管不是不可能的),这是恰当的。

答案 1 :(得分:2)

如果您希望避免异常,可以将location.get()替换为location.orElse("SomeDefaultValue")。这允许您在Optional为空时返回默认值。

答案 2 :(得分:1)

IMO,如果您正在使用&#39;也许&#39;来实施您的逻辑。 monad(可选值)你应该坚持使用Optional对象并抛弃它,只有在需要时才提取包装的值。

要修改不定值,您可以使用Optional.ifPresent()Optional.map()Optional.flatMap()方法,例如

Optional<Difficulty> difficulty = NPC.getDifficulty();
difficulty.ifPresent(diff -> { /* do comething here ... */ });