AndroidのためのValidation
本格的な開発に向けてデータバインドの戦略が決まったので、バリデーションの仕組みも考えておかなくては。
元々バリデーションの仕組みはJava/Swing用、.NET C#/Windows Forms用と共用してきた使い慣れたものがあるので、それを再利用する予定だが、最初に設計した際にはアノテーションなどは無かったので、バリデーションの制約はは全てXMLで書いていた。
一から書き直すとかなり時間がかかりそうなので、XMLと実装はそのままに、JSR 303のアノテーションだけを取り込もうと思う。
- JSR 303アノテーションの例
public class Address { @NotNull @Size(max=40) private String name; @Size(max=100) private String address; @Telno private String tel; }
JSR 303は前から気になっていたが、良いなと思うのは、上記のような直感的な制約をフィールドに設定することの他に、以下のようにネストにしたメタデータによりカスタムな制約を作成できることである。
- Telno.java
@NotNull @Size(max=12) @Pattern(regexp="^[0-9]+$") @Documented @Target({ANNOTATION_TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface Telno { String message() default "invalid telno"; }
従来はXMLで共通の制約を記述して、それを参照することですることで同様の機能を実現していたが、
- constratint.xml (参考)
〜
決してベストだとは思わないが、コードの近傍に書けること、(一度、他のアノテーションを使ったことがあれば)より直感的であること、記述のしやすさと判りやすさは、アノテーションのほうが上だろう。
参考 : Java EE 6 Bean Validation Provides Entity Validation Metadata Model and API - InfoQ