Null Safe

ユーザーがパラメーターの値を指定していないときでも ​@Parameter​ をインスタンス化する必要がある場合があります。次に例を示します。

@Parameter
@Optional
private List<Integer> numbers;

numbers​ をコードで操作する場合は、​NullPointerException​ を発生させないようにするために、どこかで ​numbers == null​ のチェックが必要です。

SDK は ​null​ の代わりに空のリストを提供する ​@NullSafe​ などのアノテーションの使用をサポートしています。これを使用すると、SDK は値が指定されていない場合には自動的に値を作成します。 次の サンプルコード​は、​List​ インターフェースに ​@NullSafe​ を使用します。

@NullSafe​ アノテーションにはいろいろな種類があります。​List​ インターフェースや ​Map​ インターフェースと一緒に使用すると、​@NullSafe​ はこれらのコレクションのデフォルト実装を作成します。

次の例では、POJO を null safe 型としています。

@Parameter
@Optional
@NullSafe
private Foo foo;

ご推察のとおり、SDK は ​Foo​ をインスタンス化して、​foo​ パラメーターに割り当てることで、手動での null チェックを不要にします。

@NullSafe​ を POJO で使用する場合は、POJO 内で宣言するすべてのパラメーターを​省略可能​とする必要があります。SDK は、必須パラメーターのデフォルト値を作成できません。そのため、​@NullSafe​ を使用して必須パラメーターを自動的にインスタンス化することは無意味です。

パラメーターの型を使用する代わりに、特定のクラスをインスタンス化するように ​@NullSafe​ を設定することもできます。これは、パラメーターの型をインスタンス化できない場合 (抽象クラスやインターフェースなど) に便利です。

インスタンス化するクラスは、アノテーションで ​defaultImplementingType​ 属性を設定することで指定します。次に例を示します。

@Parameter
@Optional
@NullSafe(defaultImplementingType = Foo.class)
private AbstractFoo foo;