Salesforce 認定 Platform デベロッパー 無料問題 8 / 10 ・ 分野3: ユーザインターフェース
Visualforce のカスタムコンポーネントで、apex:attribute の assignTo で selectedValue に値を渡す。コンポーネントのコントローラは次のとおりで、属性には値を必ず渡している。 public class CustCmpCtrl { public CustCmpCtrl() { if (selectedValue != null) { EditMode = true; } } private Boolean EditMode = false; public String selectedValue { get; set; } } EditMode について、Visualforce 開発者ガイドの説明に合うものはどれか。
- assignTo の値はコンストラクタの引数として渡されるので、コンストラクタが受け取った値で EditMode が true に切り替わる
- EditMode は private なのでコンストラクタから書き換えられず、selectedValue が null かどうかに関係なく EditMode は true にならない
- コンストラクタは setter より先に呼ばれるので、そこでは selectedValue が null で、EditMode は true にならない
- setter はコンストラクタより先に呼ばれるので、そこでは selectedValue に値が入っていて、EditMode は true になる
正解と解説を見る
正解: C
正解の理由
「Best Practices for Controllers and Controller Extensions」の Controller Constructors Evaluate Before Setter Methods は、setter がコンストラクタより先に評価されることに頼らないよう書き、この例を挙げている。コンストラクタは setter より先に呼ばれるので、コンストラクタの時点で selectedValue は null のままで、EditMode は true にならない。属性の値に応じた初期化は、コンストラクタに置かず、値が入ったあとに評価される処理で行う。
違う選択肢
「setter はコンストラクタより先に呼ばれるので、そこでは selectedValue に値が入っていて、EditMode は true になる」… ガイドはちょうど逆向きに、コンストラクタは setter より先に呼ばれるので、この例の selectedValue はコンストラクタが呼ばれる時点で null のままで、EditMode は true にならないと書いている。setter がコンストラクタより先に呼ばれることに頼らないよう求めている。
「assignTo の値はコンストラクタの引数として渡されるので、コンストラクタが受け取った値で EditMode が true に切り替わる」… assignTo は属性の値をコントローラのプロパティに入れる指定で、値は setter で入る。コンストラクタの引数としては渡されない。ガイドは、コンストラクタが setter より先に呼ばれるので、コンストラクタでは selectedValue が null だと書いている。
「EditMode は private なのでコンストラクタから書き換えられず、selectedValue が null かどうかに関係なく EditMode は true にならない」… private の変数も、同じクラスのコンストラクタからは書き換えられる。EditMode が true にならない理由は、コンストラクタが setter より先に呼ばれ、その時点で selectedValue が null だからだとガイドは説明している。
同じ節のほかの注意
コンポーネントの属性の値は、assignTo によって setter を通してコントローラのプロパティに入る。属性の値に応じた初期化は、コンストラクタに置かず、値が入ったあとに評価される処理で行う。