null
JDK 7 以降、値を受け入れることができないメソッドに渡される値を拒否するために導入されたメソッドを喜んで使用しています。
private void someMethod(SomeType pointer, SomeType anotherPointer) {
Objects.requireNonNull(pointer, "pointer cannot be null!");
Objects.requireNonNull(anotherPointer, "anotherPointer cannot be null!");
// Rest of method
}
この方法は非常に読みやすい、整然としたコードになると思います。同僚にもこの方法を使うように勧めています。しかし、ある同僚 (特に知識が豊富な人) は抵抗し、古い方法の方が効率的だと言います。
private void someMethod(SomeType pointer, SomeType anotherPointer) {
if (pointer == null) {
throw new NullPointerException("pointer cannot be null!");
}
if (anotherPointer == null) {
throw new NullPointerException("anotherPointer cannot be null!");
}
// Rest of method
}
呼び出しにはrequireNonNull
JVM 呼び出しスタックに別のメソッドを配置することが含まれるため、単純なチェックよりもパフォーマンスが低下すると彼は言います== null
。
そこで私の質問は、証拠これらの方法を使用するとパフォーマンスの低下が発生する可能性はありますかObjects.requireNonNull
?
ベストアンサー1
requireNonNull
Oracle の JDK での実装を見てみましょう。
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
だから〜だとてもシンプルJVM (Oracle のもの) には、バイトコードをマシン コードに変換する最適化された 2 段階のジャストインタイム コンパイラが含まれています。この方法でパフォーマンスが向上する場合は、このような単純なメソッドをインライン化します。
したがって、遅くなることはまずありませんし、意味のある意味でも、問題となるような場所でも遅くなることはないでしょう。
そこで私の質問は、証拠これらの方法を使用するとパフォーマンスの低下が発生する可能性はありますか
Objects.requireNonNull
?
唯一重要な証拠は、あなたのコードベース、またはそれを高度に表現するように設計されたコード。できるこれを適切なパフォーマンス テスト ツールを使用してテストしてください。ただし、同僚が、このメソッドに関連するコードベースのパフォーマンス問題の実際の例 (合成ベンチマークではなく) を指摘できない限り、あなたと同僚にはもっと重要な問題があると想定する傾向があります。
余談ですが、サンプルメソッドはprivate
メソッドであることに気付きました。そのため、チームが書いているコードだけがそれを直接呼び出します。そのような状況では、次のようなユースケースがあるかどうかを検討してください。主張実行時チェックではなく。アサーションには、「リリースされた」コードではまったく実行されないという利点があり、したがって、質問のどちらの選択肢よりも高速です。明らかに、実行時チェックが必要な場所もありますが、それは通常、ゲートキーピング ポイント、パブリック メソッドなどです。参考までに。