多くの場合、次のようなコード構成が表示されます。
_if(a == null || b == null || c == null){
//...
}
_
一度に複数のオブジェクトの無効性をチェックするために広く使用されているライブラリ(Google、Apacheなど)があるかどうか疑問に思います:
_if(anyIsNull(a, b, c)){
//...
}
_
または
_if(allAreNulls(a, b, c)){
//...
}
_
UPDATE:
それをより難しくし、元の例を次のようなものに置き換えましょう:
_if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
//...
}
_
更新2:
このギャップを修正するために、Apache Commons Langライブラリのプルリクエストを作成しました。
これらは、commons-langバージョン3.5に組み込まれます。
anyNotNull (Object... values)
allNotNull (Object... values)
EDIT 2018:Apache Commons lang 3.5以降、 ObjectUtils.allNotNull()
および ObjectUtils.anyNotNull()
。
いや.
Apache Commons Lang(3.4) 、 Google Guava(18) 、および Spring(4.1.7) は、このようなユーティリティメソッドを提供しません。
本当に必要な場合は、自分で作成する必要があります。しかし、現代のJavaコードでは、そのような構成の必要性はコードの匂いだと思います。
Java 8)では、 Stream.allMatch
を使用して、すべての値がnull
などの特定の条件に一致するかどうかを確認できます。それほど短くはありませんが、少し読みやすいかもしれません。
if (Stream.of(a, b, c).allMatch(x -> x == null)) {
...
}
anyMatch
とnoneMatch
も同様です。
あなたの「もっと難しい例」について:この場合、あなたが持っているような、nullチェックの遅延評価された組み合わせを書く方法はないと思います:
if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
...
}
ストリーム、リスト、またはvar-argメソッドを使用する他のアプローチでは、a
がnull
でないことがテストされる前に、a.getFoo()
を評価しようとします。 Optional
とメソッドポインターでmap
とメソッドポインターを使用できます。これらは次々に遅延評価されますが、これにより読みやすくなるかどうかは議論の余地があり、ケースによって異なります(特に長いクラスの場合)名前):
if (Optional.ofNullable(a).map(A::getFoo).map(B::getBar).isPresent()) {
...
}
Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);
別の方法としては、try
を使用して、最も内側の項目にアクセスすることもできますが、これもグッドプラクティスとは見なされないと感じています。
try {
Bar bar = a.getFoo().getBar();
...
catch (NullPointerException e) {
...
}
特に、これは他のNPEもキャッチしますafterその要素にアクセス-それ、またはtry
にBar bar = ...
のみを配置し、他のすべてをif
に配置する必要がありますtry
の後にブロックし、読みやすさや簡潔さの(疑わしい)利得を無効にします。
(a?.getFoo()?.getBar() != null
のような表記については漠然と覚えていますが、Javaまたは完全に異なる言語)の機能要求であったかどうかは思い出せません。)
次の方法のようなものを使用することもできます。必要な数のパラメーターを渡すことができます。
_public static boolean isAnyObjectNull(Object... objects) {
for (Object o: objects) {
if (o == null) {
return true;
}
}
return false;
}
_
好きなだけパラメーターを付けて呼び出します:
_isAnyObjectNull(a, b, c, d, e, f);
_
areAllNull
についても同様のことができます。
_public static boolean areAllObjectsNull(Object... objects) {
for (Object o: objects) {
if (o != null) {
return false;
}
}
return true;
}
_
注:if (o == null)
の代わりに三項演算子を使用することもできます。ここに示す2つのメソッドにはエラー処理がありません。ニーズに合わせて調整してください。
Objectsクラスの助けを借りて可能です
public static void requireNonNull(Object... objects) {
for (Object object : objects) {
Objects.requireNonNull(object);
}
}
オブジェクトのリストを作成し、その中でyourList.contains(null)
を使用できます。
List < Object > obList = new ArrayList < Object > ();
String a = null;
Integer b = 2;
Character c = '9';
obList.add(a);
obList.add(b);
obList.add(c);
System.out.println("List is " + obList);
if (obList.contains(null)) {
System.out.println("contains null");
} else {
System.out.println("does not contains null");
}