select文のクエリを発行しました。
結果がゼロ件じゃなかったらなにか処理をしたいです。
そんなとき、書き方が人によってまちまちなことに気づいたのでマジメに検証してみました。有耶無耶にするのは良くないことです。
ちなみに以下に結論は載っています。
https://salesforce.stackexchange.com/questions/77173/list-isempty-vs-list-size-0-vs-list-null
https://qiita.com/s_hayashida/items/15e2fcadd2140702aa96
List<Account> accList = new List<Account>();
List<Account> dummyList = new List<Account>();
String fakeId = 'xxxxxxxxxx';
accList = [select id,name from Account where id = :fakeId];
System.assertEquals(accList, dummyList);
if(accList == dummyList){
system.debug('等しい');
}
if(accList.isEmpty()){
system.debug('クエリ発行の結果が空かどうか判定するならこれだけでOK');
}
これをOpen Execute Anonymous Windowに貼り付けて動かせば一目瞭然です。
結果がゼロ件でもList型はnullにはならないので安心して!accList.isEmpty()
を使えます。accList.size() > 0
でもいいですね。どっちかに限定すると論争が起きるのではないでしょうか。私はisEmpty()
派です。
気になっていたのはこんな書き方でした。
if(accList != null && !accList.isEmpty()){
system.debug('確かに空じゃないときだけ処理されるけど...');
}
初学者が初めて変数の空チェックを書いたときにString型のnullチェックと混合して書いていたのが癖になってしまったように見えます。「ようわからんけどエラー怖いし条件2つ付けとこ...」といったノリです。私がそうでした。
List型の宣言にはこんな方法もありますが、いずれも結果はnullではなく空です。念のため。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_list.htm
List<String> strList = new List<String>();
List<String> copiedList = new List<String>(strList);
system.debug(copiedList);
Set<String> strSet = new Set<String>();
List<String> copiedList = new List<String>(strSet);
system.debug(copiedList);
Listがnullになるのは=null
で明示的にnullを代入したときだけなので、nullチェック自体がナンセンスということですね。
検証漏れてるよって場合は指摘お願いします。