以下のユースケースでも、_coll != null
_ではなくCollectionUtils.isNotEmpty(coll)
を使用するための多くのアドバイス。
_if (CollectionUtils.isNotEmpty(coll)) {
for (String str : coll) {
}
}
_
の代わりに
_if (coll != null) {
for (String str : coll) {
}
}
_
ここで他の代わりにCollectionUtils.isNotEmpty(coll)
を使用する理由/利点はありますか?ありがとう。
ここには本当の利点はありません。あったとしても、非常に小さいでしょう。 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()
呼び出しを犠牲にします。
問題は、コレクションがnullでない場合でも、コレクションが空のままになる可能性があることです。したがって、あなたの場合、それはあなたが何を選択するかによって異なります。
逆コンパイルすると明らかになります
public static boolean isEmpty(Collection coll) {
return coll == null || coll.isEmpty();
}
上で説明したように、テストする対象とロジックの構築方法によって異なります。
あなたの例を考えてみましょう
_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つもありません。 。
もちろん、if
式coll != null && coll.isNotEmpty()
はCollectionUtils.isNotEmpty(coll)
と同じ作業を行います。
したがって、コレクション_coll != null
_のみの場合にnullでテストを使用することはお勧めできません。これは、治療が不十分な極限状態の場合であり、望ましくない結果の原因となる可能性があります。