AndroidとJavaBeans

Android SDKはJavaBeansをサポートしていない。

JavaにおけるJavaBeansとは再利用可能なソフトウェアコンポーネントを書く際の規約であり、仕様や規格ではない。なのでJavaBeansに準拠していなくてもそれは大したことではないと考えるだろうが、そうでも無いのだ。

JavaBeansはJavaが仕事で使われから10年以上経つ間にCoC(Convention Over Configuration)として扱われるようになっているため、それを当たり前だと考えるプログラマやソフトウェアが既に大量に存在していること自体が重要なのだ。

trail JavaBeans(TM) (The Java™ Tutorials)

  • JavaBeansの規約(の一部)
    • publicで引数なしのコンストラクタが必要
    • メソッドの命名規則に従わなくてはならない(プロパティとして扱うフィールドは、同じ型を戻り値と引数とするアクセサメソッドが必要など)
    • シリアライズ可能でなくてはならない


当たり前なんだが、SDK中のクラス、それもViewクラスを基点とするGUIのクラスツリーはJavaBeansに準拠していないので、JavaBeans規約では有効だったルールでメタ情報としてのプロパティ(フィールドの型、getter/setterメソッド)を収集できない。

例えば、EditTextクラスで使用される"編集可能なテキスト"に対するアクセサメソッドはAndroid SDKのリファレンスによると

public Editable getText ()

    • setter

public void setText (CharSequence text, TextView.BufferType type)


と、いきなりsetterの引数の型と個数が違う。
ならばとスーパークラスであるTextViewクラスに遡ってみると

    • setter

public void setText (int resid)
public void setText (int resid, TextView.BufferType type)
public void setText (char[] text, int start, int len)
public void setText (CharSequence text)
public void setText (CharSequence text, TextView.BufferType type)

と大量のオーバーロードはあるものの、引数の個数が一致する
public void setText (int resid)
public void setText (CharSequence text)

このどちらもgetterの戻り値の型と一致しないのである。
幸いというか、後者のメソッドの引数の型CharSequenceに対してgetterの戻り値の型であるEditableには代入互換性があるので、これらを対にすることでプロパティと扱うことは可能だが、既にこの時点で一般的なルールに沿ってプロパティ情報を取得することができないということが判る。

これが後々、色々な所で問題になるような気がしてならない。