AndroidのためのValidation

本格的な開発に向けてデータバインドの戦略が決まったので、バリデーションの仕組みも考えておかなくては。

JSR 303: Bean Validation

元々バリデーションの仕組みはJava/Swing用、.NET C#/Windows Forms用と共用してきた使い慣れたものがあるので、それを再利用する予定だが、最初に設計した際にはアノテーションなどは無かったので、バリデーションの制約はは全てXMLで書いていた。

一から書き直すとかなり時間がかかりそうなので、XMLと実装はそのままに、JSR 303のアノテーションだけを取り込もうと思う。

public class Address {
   @NotNull @Size(max=40) 
   private String name;
   @Size(max=100)
   private String address;
   @Telno
   private String tel;
}

JSR 303は前から気になっていたが、良いなと思うのは、上記のような直感的な制約をフィールドに設定することの他に、以下のようにネストにしたメタデータによりカスタムな制約を作成できることである。

@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