ApexでSObjectType取得操作のパフォーマンス解説


Salesforce ApexにおけるSObjectType取得操作のコストについて

Apexで、例えば以下のように記述した場合:

List<Opportunity> opportunitiesToUpdate = new List<Opportunity>();
for(Event anEvent : events) {
    if(anEvent.WhatId?.getSObjectType() == Opportunity.SObjectType) {
        // 処理
    }
}
    
update opportunitiesToUpdate;

このコードは、WhatIdが非nullの場合に、そのIDからSObjectTypeを取得し、OpportunityのSObjectTypeと比較しています。この方法は、以下の理由から非常に効率的です。


1. キャッシュの利用

Salesforceプラットフォームは、SObjectTypeやSObjectFieldのメタデータ情報を内部的にキャッシュしています。

  • Opportunity.SObjectType はコンパイル時に定義された定数であり、すぐに利用可能です。
  • anEvent.WhatId?.getSObjectType() は、既にキャッシュされたメタデータから型情報を取得するため、高価なdescribe呼び出しを避けられます

そのため、完全なdescribe呼び出し(数ミリ秒かかる可能性がある)に比べ、この操作は極めて低コストです。


2. 安全なナビゲーション

  • ?. 演算子は、WhatIdがnullの場合にエラーを回避するため、余分な例外処理を不要にします。
  • このため、nullチェックを別途記述する必要がなく、コードの可読性が向上します。

3. パフォーマンスインパクト

実際のパフォーマンスに関しては、キャッシュされたメタデータにアクセスするため、ごく僅かな時間(通常はミリ秒未満)で実行されます

  • 大量のレコードや複雑なロジックが存在しない限り、ほとんどパフォーマンスに影響を与えません。

まとめ

  • 低コスト: anEvent.WhatId?.getSObjectType() はキャッシュ済みメタデータを利用するため、フルdescribe呼び出しよりも大幅に高速です。
  • 安全性: ?. 演算子により、nullチェックが自動で行われ、エラーを防止します。
  • 推奨: Apexでは、型チェックの際に文字列を直接比較するのではなく、SObjectTypeオブジェクトを使用する方法が推奨されます。

このアプローチにより、開発者は効率的かつ安全にレコードの型チェックを行うことができます。

コメント