以下の内容はhttps://plugout.hateblo.jp/entry/2019/12/27/055742より取得しました。


【Java】Optional.orElse()の落とし穴

またしょーもない所で詰まったので備忘録がてらにメモ。

以下のプログラムで[hoge]内の[fuga]には何が代入されているかという問題。

例: Sample1.java

package test;

import java.util.Optional;

public class Sample1 {
  public static void main(String[] args) {
    Hoge hoge = new Hoge();
    Optional.of(hoge).orElse(hoge.withFuga("bar"));
    System.out.print(hoge.getFuga());
  }

  public static class Hoge {
    private String fuga = "foo";

    public Hoge withFuga(String fuga) {
      this.fuga = fuga;
      return this;
    }
    public String getFuga() {
      return fuga;
    }
  }
}

[hoge.getFuga()]の出力結果は[fooの文字列]である……と言いたい所だが[barの文字列]である。

実はこのプログラム、よく見ると[Optional.orElse()]に渡す時点でwithFuga()が実行されているためである。

もし本当に[Optional]nullの場合だけ[barの文字列][foo]にセットしたい場合には[Optional.orElseGet()]を使用する。

例: Sample2.java

package test;

import java.util.Optional;

public class Sample2 {
  public static void main(String[] args) {
    Hoge hoge = new Hoge();
    Optional.of(hoge).orElseGet(() -> hoge.withFuga("bar"));
    System.out.print(hoge.getFuga());
  }

  public static class Hoge {
    private String fuga = "foo";

    public Hoge withFuga(String fuga) {
      this.fuga = fuga;
      return this;
    }
    public String getFuga() {
      return fuga;
    }
  }
}

[hoge.getFuga()]の出力結果は[fooの文字列]である

 




以上の内容はhttps://plugout.hateblo.jp/entry/2019/12/27/055742より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14