Waterlogged Annotation
Activityクラスにおいて、フィールドに対してどんな種類の(といってもサポートされていることが前提だが)でも良いから、アノテーションを宣言して、それをランタイム中で取得しようとするとキャッチできない例外でランタイムが落ちる。
現状のSDKで上記の問題は回避できないとして、当面、複数のアノテーションをフィールドに対して宣言したい場合、どうするか?
@A @B protected EditText editText01;
"B is a A"の関係がある場合に限るが、C#ならば迷わずこの方法だ。しかしJavaのアノテーションは継承ができないので駄目。(この辺のJavaの実装は実に残念だ)
一つの代表となるアノテーションに、宣言する可能性のある他の機能アノテーションを集約する方法だ。過去に日記で採りあげたこともある。
ネストするアノテーション
@Inherited @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface C { A A(); B B(); } : : //使うとしたらこんな感じ public class HogeActivity extends Activity @C(@A, @B) protected EditText editText01;
これで完璧だと思ったが、今度はこのアノテーションCを取得しようとするとやはり落ちる。今度は全く違う理由で落ちているようだが、さっぱり解らない。いろいろと試してみたが、ようやく一つ再現性があるバグを見つけた。
- アノテーション内部に int[] 型の属性を持つ場合。
@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface B {
int Id() default 0;
int[] IdArray() default {};
}
このケースだと単独のアノテーションでもDalvikランタイムは落ちてしまう。
アノテーションはまだ使い物にならないってか?