私のクラスでインターフェースを実装したいのですが、ある面でITDを使ったメソッドの実装を提供したいと思います。 これは可能ですか?AspectJ ITDs:汎用インターフェースの実装
インタフェース:
public interface CloningService<T> {
public T clone(T object);
}
デフォルトの実装:
public class DefaultCloningServiceImpl implements CloningService<T> {
public T clone(T object) {
// implementation of the clone method
}
}
具体的なインプリメンテーション:クラスPersonServiceは、それがCloningServiceインタフェースを実装することを宣言し
public class PersonService implements CloningService<Person> {
// no code (!)
}
が、実際の実装メソッドのDefaultCloningServiceImplで提供され、アスペクトはそれらをPersonServiceに導入します。
私はEclipse.comの例に従っており、@DeclareParentsを使用して上記の機能を実現しようとしました。しかし、AspectJからコンパイルエラーが発生しました。これはジェネリックスと関係があります。 @DeclareParentsアノテーションでジェネリックが使用されるとは思われないかのようです。
ありがとうございました。
Andrew、あなたの答えに感謝します。これは良いアイデアのように思えますが、私は2つの質問があります:(1)アノテーションスタイルaspectjが好まれませんか?私の感動は、それがベストプラクティスであるということでした。 (2)あなたが提供したコードはPersonServiceを拡張しますが、私は別のJARにこのロジックを入れたいので、注釈でマークされたすべてのサービスを拡張したいと思います。私のためにはうまくいくだろうか? – anton1980
いいえ、注釈スタイルは好ましくありません。 1つの理由から、ツールはアノテーションスタイルではうまく機能しません。また、アノテーションスタイルでは単純にできないものもあります(例:intertype宣言)。人々がコードスタイルよりもアノテーションスタイルを選択する主な理由は、標準のJavaコンパイラでコードをコンパイルできるようにすることです(そして、その上でウィーバーを実行します)。 –
あなたの質問にもっと完全に答えるために上記の私の答えを展開しました。 –