0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SOQL発行後のList型空チェック

Posted at

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チェック自体がナンセンスということですね。
検証漏れてるよって場合は指摘お願いします。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?