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)