web-dev-qa-db-ja.com

CollectionUtils.isNotEmpty()はnullチェックよりも優れていますか?

以下のユースケースでも、_coll != null_ではなくCollectionUtils.isNotEmpty(coll)を使用するための多くのアドバイス。

_if (CollectionUtils.isNotEmpty(coll)) {
    for (String str : coll) {
    }
}
_

の代わりに

_if (coll != null) {
    for (String str : coll) {
    }
}
_

ここで他の代わりにCollectionUtils.isNotEmpty(coll)を使用する理由/利点はありますか?ありがとう。

4
Trying

ここには本当の利点はありません。あったとしても、非常に小さいでしょう。 Iteratorの作成と分岐命令の実行を防ぐだけで、これですべてです。

この小さな利点は、コレクションが空の場合にのみ発生します。次のループ:

_for (String str : coll) {
   ...
}
_

と同等です:

_for (Iterator<String> iterator = col.iterator(); iterator.hasNext();) {
   String str = iterator.next();
   ...
}
_

コレクションが空の場合、CollectionUtils.isNotEmpty(coll)をチェックすると、ループが実行されなくなります。したがって、Iteratorはメモリに作成されず、hasNext()の呼び出しは行われません。これは、O(1)へのcoll.isEmpty()呼び出しを犠牲にします。

3
manouti

問題は、コレクションがnullでない場合でも、コレクションが空のままになる可能性があることです。したがって、あなたの場合、それはあなたが何を選択するかによって異なります。

1
NaN

逆コンパイルすると明らかになります

public static boolean isEmpty(Collection coll) {
    return coll == null || coll.isEmpty();
}
1
taanielo

上で説明したように、テストする対象とロジックの構築方法によって異なります。

あなたの例を考えてみましょう

_if (CollectionUtils.isNotEmpty(coll)) {
  for (String str : coll) {
     System.out.println("Branch 1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch 2. Collection is empty.");
}
_

この例では、常に Branch1またはBranch2が実行されていることがわかります。

Null式を使用する場合、collがnullではなく空の場合、結果は異なります。

_if (coll != null) {
  for (String str : coll) {
     System.out.println("Branch1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch2. Collection is empty.");
}
_

コレクションcollがnullではないが空である場合、または条件_coll != null_がtrueであるため、Branch1もBranch2も実行されない場合、ループforにはパスが1つもありません。 。

もちろん、ifcoll != null && coll.isNotEmpty()CollectionUtils.isNotEmpty(coll)と同じ作業を行います。

したがって、コレクション_coll != null_のみの場合にnullでテストを使用することはお勧めできません。これは、治療が不十分な極限状態の場合であり、望ましくない結果の原因となる可能性があります。

0
hariprasad