logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« RestでForce.comのデータにServletからアクセスするテスト | トップページ | Apex soqlでリッチテキストエリアのフィールドがNo such columnと言われる »

Apex Transientキーワード

ケーピーエスのForce.com研修でApexのTransientキーワードの件を説明する部分があったのですが、少々内容が専門的すぎるので、次回から割愛するつもりでいます。
そこで、とりあえず、こちらのブログの方にポイントを書いておくことにします。
まずは、マニュアルで説明されている例。

[コントローラークラス]
public class ExampleController {     DateTime t1;     transient DateTime t2;     public String getT1() {         if (t1 == null) t1 = System.now();         return '' + t1;     }     public String getT2() {         if (t2 == null) t2 = System.now();         return '' + t2;     } }

上記例では、コントローラークラスにt1,t2の二つのインスタンス変数が設定されています。
t2の方にのみ transient キーワードが設定されています。
このコントローラーを、以下のVisualforceページでアクセスします。

[Visualforceページ]

<apex:page controller="ExampleController">
  T1: {!t1} <br/>
  T2: {!t2} <br/>
  <apex:form>
    <apex:commandLink value="refresh"/>
  </apex:form>
</apex:page>

このページをリフレッシュすると、 transient キーワードを設定したt2のみが更新されるはずです。

Force.comでは、呼ばれるコントローラが同一の場合、コントローラのインスタンス変数はリクエストをまたがって保管されます。これは、Force.comのフレームワークが、コントローラのインスタンスをリクエスト終了時にシリアラズ化して、ブラウザー側に保管し、それを次回のリクエスト時に再構築してくれるからです。

一方、 transient キーワードは、このシリアライズ化を行わない宣言になります。よって、上記の変数t2は、毎回リクエスト開始時点ではnullなので、表示が更新されるわけです。

さて、では transient キーワードは、どんな時に使うものでしょうか?

①パフォーマンス上の観点

コントローラーの変数として、量の大きいオブジェクト(エントリーの多いリストとかマップとか)を持っていると、リクエスト終了時に、Force.comのフレームワークはこれらをすべてシリアライズ化してブラウザーに送信します。

あえて、リクエスト間で保管する必要の無い変数に関しては、transient キーワードを設定することで、このオーバーヘッドを無くすことができます。

②シリアライズできないオブジェクトをインスタンス変数に持つ場合

Apex環境では、シリアライズ不可のタイプのオブジェクトがあります。

メタデータ系のタイプ等がこれに該当します。

例えば、コントローラーのインスタンス変数に以下のように定義した場合。

public class ExampleController {

private Schema.Describesobjectresult dsc = Task.sobjectType.getDescribe();

        :

以下のようなエラーになります。

System.SerializationException: Not Serializable: Schema.DescribeSObjectResult

これは、Schema.Describesobjectresultというタイプはシリアライズ不可のタイプである事を示しています。

この場合変数の定義に transient 加える事で、エラーを回避できます。

public class ExampleController {

private transient Schema.Describesobjectresult dsc = Task.sobjectType.getDescribe();

    :

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * -
     ネットのパワーを不動産業へ生かす!
     不動産業向け顧客管理・営業支援システム  顧きゃく録!
- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *

« RestでForce.comのデータにServletからアクセスするテスト | トップページ | Apex soqlでリッチテキストエリアのフィールドがNo such columnと言われる »

Force.com」カテゴリの記事

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40285560

この記事へのトラックバック一覧です: Apex Transientキーワード:

« RestでForce.comのデータにServletからアクセスするテスト | トップページ | Apex soqlでリッチテキストエリアのフィールドがNo such columnと言われる »