ApexのDML操作における空リストの扱い:チェックは必要?

【DML操作時のリストの空チェック:必要か?】

ApexコードでDML操作を行う際、リストが空かどうかをチェックするケースはよくあります:

if (!recordsToUpdate.isEmpty()) {
    update recordsToUpdate;
}

このコードでは、リストが空でない場合のみ`update`操作が実行されます。しかし、直接`update`文を記述する場合:

update recordsToUpdate;

果たしてこれが問題になるのか?以下に詳しく解説します。


結論:リストが空の場合、DML操作は安全

`update`文やその他のDML操作(`insert`, `delete`, `upsert`など)に空のリストを渡した場合、エラーは発生せず、プラットフォームリソースも消費しません。したがって、明示的に`isEmpty()`チェックを行う必要はありません。

理由:

  1. Apexの仕様
    Apexは空のリストがDML操作に渡されても無視します。例えば、`update`に空のリストを渡した場合、実際には何も実行されないため、データベース操作や消費リソースが発生しません。
  2. DML限界値(Governor Limits)
    空のリストでDML操作を行っても、DML操作のカウントは増加しません。つまり、Governor Limitsに影響を与えることはありません。

空チェックの不要性を示すコード例

以下は空のリストをDML操作に渡す場合の動作確認コードです:

@isTest
private class EmptyListDMLTest {
    static testMethod void testEmptyUpdate() {
        List<Account> emptyAccounts = new List<Account>();
        
        // 空リストをDMLに渡す
        update emptyAccounts;

        // テスト成功 - エラーなし
        System.assert(true, 'No error should occur when updating an empty list');
    }
}

チェックを省略することでコードを簡潔に

リストが空の場合に何も行われないことが保証されているため、以下のように直接DML操作を記述する方が推奨されます:

update recordsToUpdate;

これによりコードが簡潔になり、メンテナンス性も向上します。


チェックを行う場合の例外的なケース

特定の状況では、リストが空かどうかをチェックすることが有益です:

  1. デバッグやログの追加
    処理対象がないことをログに記録したい場合:
  2. if (recordsToUpdate.isEmpty()) {
        System.debug('No records to update');
    } else {
        update recordsToUpdate;
    }
    
  3. 特定のビジネスロジックの実装
    空のリストを処理する際に何らかのカスタム処理を追加する場合。

コメント