問題
開発者は以下のコントローラクラスを持ちます。
public with sharing class myFooController{
public integer prop {get; private set;}
}
どのコードブロックが実行匿名ウィンドウで正常に実行されますか。
- myFooController m = new myFooController();
System.assert(m.prop == null); - myFooController m = new myFooController();
System.assert(m.prop == 0); - myFooController m = new myFooController();
System.assert(m.prop == 1); - myFooController m = new myFooController();
System.assert(m.prop != null);
正解
- myFooController m = new myFooController();
System.assert(m.prop == null); - myFooController m = new myFooController();
System.assert(m.prop == 0); - myFooController m = new myFooController();
System.assert(m.prop == 1); - myFooController m = new myFooController();
System.assert(m.prop != null);
解説
Apexにおけるinteger
型の変数は、初期化されていない場合、デフォルトでnull
になります。これはJavaなどの言語とは異なり、プリミティブ型でもnull
を許容する点が特徴です。したがって、初期化されていないinteger
型のプロパティにアクセスすると、null
を返します。
それぞれの選択肢の理由について説明します。
□ myFooController m = new myFooController();
System.assert(m.prop == null);
これは正解です。prop
は初期化されておらず、デフォルトでnull
を持つため、このアサーションは成功します。
□ myFooController m = new myFooController();
System.assert(m.prop == 0);
これは不正解です。Apexでは整数型は自動的に0で初期化されないため、このアサーションは失敗します。prop
はnull
であるためです。
□ myFooController m = new myFooController();
System.assert(m.prop == 1);
これは不正解です。prop
は初期化されていないためnull
です。1
で初期化されることはありませんので、このアサーションも失敗します。
□ myFooController m = new myFooController();
System.assert(m.prop != null);
これは不正解です。前述の通り、prop
はnull
で初期化されるため、このアサーションは失敗します。
コメント