Salesforce 認定 Platform デベロッパー 上級 無料問題 4 / 10 ・ 分野2: ロジックとプロセスの自動化
バッチ Apex のクラスに Database.Stateful を付け、処理した金額の合計を数えている。合計は static の変数 total と、インスタンスの変数 sum の両方に足している。finish で読んだときの値について正しいものはどれか。
- sum は塊をまたいで保たれ、total は塊ごとに元の値に戻る
- total と sum の両方が、塊をまたいで保たれる
- total と sum の両方が、塊ごとに元の値に戻る
- total は塊をまたいで保たれ、sum は塊ごとに元の値に戻る
正解と解説を見る
正解: A
正解の理由
バッチ Apex の各 execute は別のトランザクションになる。クラスの定義で Database.Stateful を指定すると、これらのトランザクションをまたいで状態を保てる。Database.Stateful を使うとき、トランザクションの間で値が保たれるのはインスタンスのメンバ変数だけで、static のメンバ変数は保たれず、トランザクションの間で戻される。Database.Stateful を指定しないと、static もインスタンスのメンバ変数も元の値に戻る。
違う選択肢
「total と sum の両方が、塊をまたいで保たれる」… Database.Stateful を付けても、トランザクションの間で値が保たれるのはインスタンスのメンバ変数だけ。static のメンバ変数は保たれず、トランザクションごとに戻る。
「total は塊をまたいで保たれ、sum は塊ごとに元の値に戻る」… 逆になっている。Database.Stateful で保たれるのはインスタンスのメンバ変数で、static のメンバ変数は保たれない。
「total と sum の両方が、塊ごとに元の値に戻る」… 両方が戻るのは Database.Stateful を付けないとき。付けたときは、インスタンスのメンバ変数の値が保たれる。
使いどころ
処理したレコードの件数や合計を数えるときに状態を保つと便利で、ドキュメントの例も execute で合計を足していく。数える変数はインスタンスのメンバ変数として宣言し、finish でまとめて記録する。