- リンクを取得
- ×
- メール
- 他のアプリ
- リンクを取得
- ×
- メール
- 他のアプリ
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オブジェクトを使用する方法が推奨されます。
このアプローチにより、開発者は効率的かつ安全にレコードの型チェックを行うことができます。
コメント
コメントを投稿