transient キーワードの使用
transient キーワードは、保存ができず、Visualforce ページのビューステートの一部として送信することもできないインスタンス変数の宣言に使用します。たとえば、次のように使用します。
1Transient Integer currentTotal;また、逐次化可能な Apex クラス (つまり、コントローラ、コントローラ拡張、Batchable または Schedulable インターフェースを実装するクラス) で transient キーワードを使用できます。また、逐次化可能なクラスで宣言する項目の型を定義するクラスで transient を使用できます。
変数を transient として宣言すると、ビューステートのサイズが縮小されます。transient キーワードは、Visualforce ページでページ要求の間のみ必要な項目でよく使用されます。この項目は、ページのビューステートには含まれず、要求中に何度も再計算するには非常に大きなシステムリソースを使用します。
Apex オブジェクトの中には、自動的に transient と判断されるものもあります。つまり、その値はページのビューステートの一部として保存されません。例として次のようなオブジェクトがあります。
- PageReferences
- XmlStream クラス
- コレクションが自動的に transient とマーキングされるのは、Savepoints のコレクションなど、コレクションに含まれているオブジェクトが自動的に transient とマーキングされている場合だけです。
- Schema.getGlobalDescribe などほとんどのオブジェクトがシステムメソッドにより自動的に生成されます。
- JSONParser クラスインスタンス。
また、静的な変数はページのビューステートを使用して転送されません。
次の例には、Visualforce ページとカスタムコントローラの両方が含まれてます。ページが更新されるごとに transient 日付は再作成されるため、[refresh] ボタンをクリックすると、日付が更新されます。非 transient 日付には、ビューステートから逐次化されなかった元の値が保持されるため、変わりません。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="ExampleController">
18 T1: {!t1} <br/>
19 T2: {!t2} <br/>
20 <apex:form>
21 <apex:commandLink value="refresh"/>
22 </apex:form>
23</apex:page>
241swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class ExampleController {
18
19 DateTime t1;
20 transient DateTime t2;
21
22 public String getT1() {
23 if (t1 == null) t1 = System.now();
24 return '' + t1;
25 }
26
27 public String getT2() {
28 if (t2 == null) t2 = System.now();
29 return '' + t2;
30 }
31}
32