CacheBuilder インターフェースを使用した安全な値のキャッシュ
Apex クラスで何をキャッシュするかを宣言するだけでなく、CacheBuilder インターフェースを実装する内部クラスを作成します。このインターフェースには、doLoad(String var) という 1 つのメソッドがあり、doLoad(String var) メソッドの引数に基づいてキャッシュ値を構築するロジックのコードを作成して上書きします。
CacheBuilder でキャッシュした値を取得するために、doLoad(String var) メソッドを直接コールすることはありません。代わりに、CacheBuilder を実装するクラスを初めて参照するときに Salesforce が間接的にコールします。値が存在する場合は、それ以降のコールでキャッシュから値が取得されます。値が存在しない場合は、値を構築するために doLoad(String var) メソッドが再度コールされ、その後その値が返されます。そのため、CacheBuilder インターフェースを使用しているときは、put() メソッドを実行しません。doLoad(String var) メソッドによってキャッシュの欠落がチェックされるため、null 値を確認するコードを各自が記述する必要はありません。
例を見てみましょう。Visualforce ページの Apex コントローラークラスのコードを記述しているとします。Apex クラスで、ユーザー ID を基にユーザーレコードを検索する SOQL クエリを実行することがよくあります。SOQL クエリは高価である可能性があります。また、通常、Salesforce ユーザーレコードは頻繁に変更されません。そのため、ユーザー情報が CacheBuilder の適切な候補になります。
コントローラークラスで、CacheBuilder インターフェースを実装して、doLoad(String var) メソッドを上書きする内部クラスを作成します。次に、ユーザー ID をそのパラメーターとする doLoad(String var) メソッドに SOQL コードを追加します。
1class UserInfoCache implements Cache.CacheBuilder {
2 public Object doLoad(String userid) {
3 User u = (User)[SELECT Id, IsActive, username FROM User WHERE id =: userid];
4 return u;
5 }
6}組織のキャッシュからユーザーレコードを取得するには、UserInfoCache クラスとユーザー ID を渡す Org.get(cacheBuilder, key) メソッドを実行します。同様に、Session.get(cacheBuilder, key) と Partition.get(cacheBuilder, key) を使用して、それぞれセッションまたはパーティションのキャッシュから値を取得します。
1User batman = (User) Cache.Org.get(UserInfoCache.class, ‘00541000000ek4c');get() メソッドを実行すると、Salesforce が、文字列 00541000000ek4c と UserInfoCache で構成される一意のキーを使用してキャッシュを検索します。キャッシュ値が検��された場合は、その値が返されます。この例のキャッシュ値は、ID 00541000000ek4c に関連付けられたユーザーレコードです。値が見つからない場合は、Salesforce が UserInfoCache の doLoad(String var) メソッドを再度実行して (および SOQL クエリを再度実行して)、ユーザーレコードをキャッシュしてから、そのレコードを返します。
CacheBuilder のコーディング要件
CacheBuilder インターフェースを実装するクラスのコードを記述するときは、次の要件に従います。
- doLoad(String var) メソッドは、そのメソッドのコードでパラメーターを使用しなくても、String パラメーターを取る必要があります。Salesforce は文字列とクラス名を組み合わせて、キャッシュ値の一意のキーを構築します。
- doLoad(String var) メソッドは、null を含めてどのような値も返す可能性があります。null 値が返された場合、直接 CacheBuilder コンシューマーに配信され、キャッシュされません。CacheBuilder コンシューマーは null 値を適切に処理するよう期待されています。キャッシュキーを再作成するための一時的なエラーを反映させるには null 値を使用することをお勧めします。
- CacheBuilder を実装するクラスは非静的でなければなりません。Salesforce がクラスを新たにインスタンス化し、doLoad(String var) メソッドを実行してキャッシュ値を作成するためです。