Objects.requireNonNull() を使用する理由は何ですか? 質問する

Objects.requireNonNull() を使用する理由は何ですか? 質問する

Oracle JDK の多くの Java 8 メソッドは を使用していることに気付きました。Objects.requireNonNull()これは、NullPointerException指定されたオブジェクト (引数) が である場合に内部的に をスローしますnull

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

しかし、オブジェクトが逆参照されるNullPointerExceptionと、いずれにせよスローされますnull。では、なぜこの追加の null チェックとスローを行う必要があるのでしょうかNullPointerException?

Objects.requireNonNull()明らかな答え (または利点) の 1 つは、コードが読みやすくなることです。私も同意します。メソッドの先頭でを使用する他の理由もぜひ知りたいです。

ベストアンサー1

そうすることで物事を明示的にすることができるからです。例えば:

public class Foo {
  private final Bar bar;

  public Foo(Bar bar) {
    Objects.requireNonNull(bar, "bar must not be null");
    this.bar = bar;
  }

または短く:

  this.bar = Objects.requireNonNull(bar, "bar must not be null");

これでわかりました:

  • Fooオブジェクトが正常に作成されたときnew()
  • そのbarフィールドはnull 以外であることが保証されます。

これを次のように比較してください。今日 Foo オブジェクトを作成し、明日はそのフィールドを使用して例外をスローするメソッドを呼び出します。おそらく、その参照が昨日コンストラクターに渡されたときにnull だった理由は明日はわからないでしょう。

言い換えると、このメソッドを明示的に使用して着信参照をチェックすることで、例外がスローされる時点を制御できます。ほとんどの場合、できるだけ早く失敗することが望まれます。

主な利点は次のとおりです。

  • 前述の通り、制御された行動
  • デバッグが簡単になります - オブジェクト作成のコンテキストでスローするためです。ログ/トレースで何が間違っていたかがわかる可能性がある程度あります。
  • そして、上で示したように、このアイデアの真の威力は、finalフィールドと組み合わせることで発揮されます。クラス内の他のコードは、それが null ではないと安全に想定できるため、他の場所でのチェックはbar不要になります。if (bar == null)

おすすめ記事