アノテーションによるアサーション(その12 オーバーライド時の整合性編)
概要
バージョン 0.0.13 にて、メソッドのオーバーライドに制限を追加しました。この変更により、メソッドをオーバーライドする際に、オーバーライドする側がされる側と同様の制約アノテーションを持たない場合にはエラーになるようになりました。これはリスコフの置換原則(Liskov substitution principle)を意識したものです。継承を単なるソースコードの再利用と位置づけた場合にはこのような制約は足枷になるかもしれませんが、継承は is-a 関係になるべきだという意図を明確に打ち出すために、あえてこのような制約を強制するようにしました。*1
例
バージョン0.0.12以前は、以下の例はエラーになりませんでしたが、0.0.13からはエラーとなりウィービングが行われません。
interface Alpha { void set(@Max(10) int value); } interface Beta extends Alpha { // value に @Max の制約がかかっていないためにウィービング失敗 void set(int value); }
-
- -
- アノテーションによるアサーション(その1)
- アノテーションによるアサーション(その2 mavenプラグイン編)
- アノテーションによるアサーション(その3 java agent 編)
- アノテーションによるアサーション(その4 eclpse 編)
- アノテーションによるアサーション(その5 訂正編)
- アノテーションによるアサーション(その6 @Max, @Min 編)
- アノテーションによるアサーション(その7 @NotEmpty 編)
- アノテーションによるアサーション(その8 java5 編)
- アノテーションによるアサーション(その9 インラインか、メソッド呼び出しか、それが問題だ編)
- アノテーションによるアサーション(その10 @Max, @Min 編)
- アノテーションによるアサーション(その11 @Max, @Min 編)
- アノテーションによるアサーション(その12 オーバーライド時の整合性編)
*1:この制約が明らかに問題になるケースがみつかったら excludes のようなオプションを追加するかもしれません。