web-dev-qa-db-ja.com

複数のオブジェクトの無効性を確認する方法は?

多くの場合、次のようなコード構成が表示されます。

_if(a == null || b == null || c == null){
    //...
}
_

一度に複数のオブジェクトの無効性をチェックするために広く使用されているライブラリ(Google、Apacheなど)があるかどうか疑問に思います:

_if(anyIsNull(a, b, c)){
    //...
}
_

または

_if(allAreNulls(a, b, c)){
    //...
}
_

UPDATE:

  1. 私は自分でそれを書く方法を完全に知っています
  2. 私はそれが悪いプログラム構造の結果である可能性があることを知っていますが、ここではそうではありません
  3. それをより難しくし、元の例を次のようなものに置き換えましょう:

    _if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
        //...
    }
    _

更新2:

このギャップを修正するために、Apache Commons Langライブラリのプルリクエストを作成しました。

これらは、commons-langバージョン3.5に組み込まれます。

  • anyNotNull (Object... values)
  • allNotNull (Object... values)
42
Krzysztof Wolny

EDIT 2018:Apache Commons lang 3.5以降、 ObjectUtils.allNotNull() および ObjectUtils.anyNotNull()


いや.

Apache Commons Lang(3.4)Google Guava(18) 、および Spring(4.1.7) は、このようなユーティリティメソッドを提供しません。

本当に必要な場合は、自分で作成する必要があります。しかし、現代のJavaコードでは、そのような構成の必要性はコードの匂いだと思います。

24
Petr Janeček

Java 8)では、 Stream.allMatch を使用して、すべての値がnullなどの特定の条件に一致するかどうかを確認できます。それほど短くはありませんが、少し読みやすいかもしれません。

if (Stream.of(a, b, c).allMatch(x -> x == null)) {
    ...
}

anyMatchnoneMatchも同様です。


あなたの「もっと難しい例」について:この場合、あなたが持っているような、nullチェックの遅延評価された組み合わせを書く方法はないと思います:

if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
    ...
}

ストリーム、リスト、またはvar-argメソッドを使用する他のアプローチでは、anullでないことがテストされる前に、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その要素にアクセス-それ、またはtryBar bar = ...のみを配置し、他のすべてをifに配置する必要がありますtryの後にブロックし、読みやすさや簡潔さの(疑わしい)利得を無効にします。

a?.getFoo()?.getBar() != nullのような表記については漠然と覚えていますが、Javaまたは完全に異なる言語)の機能要求であったかどうかは思い出せません。)

36
tobias_k

次の方法のようなものを使用することもできます。必要な数のパラメーターを渡すことができます。

_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つのメソッドにはエラー処理がありません。ニーズに合わせて調整してください。

12
kamwo

Objectsクラスの助けを借りて可能です

public static void requireNonNull(Object... objects) {
    for (Object object : objects) {
        Objects.requireNonNull(object);
    }
}
1
viavad

オブジェクトのリストを作成し、その中で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");
}

[〜#〜] demo [〜#〜]

0
singhakash