@Overrideの姉弟。

@Override アノテーションってあるじゃないですか。

「オーバーライドの対象である」という意図をコンパイラに明示するもので、メソッド名のtypoや引数型のミスを指摘してくれる、便利なアノテーションです。

このアノテーション、好きです。愛してます。

ただ、@Override に姉さんと弟さんが欲しいな、と最近思ったのであります。名付けて @Implement と…。んー、弟の名前が思いつかない。とりあえず @Through にしときましょう。

public interface Sample {

  void sampleMethodA();
  void sampleMethodB();

}

@Through("sampleMethodB")
public abstract class AbstractSample implements Sample {

  public void execute() {
    /* … */
  }

  @Implement
  public void samplemethodA() {
    /* … */
  }

}

public class SampleImpl extends AbstractSample {

  @Implement
  public void samplemethodB() {
    /* … */
  }

}

例えばこんなコード。

@Implement は「interfaceの実装だよ」という意図を、@Through は「このクラスでは実装せず(実装をスルーして)、abstractとして子クラスに実装を任せる」という意図をコンパイラに伝えるアノテーションとします。

例えば、従来ですと Sample#sampleMethodA() が不要になって削除した場合、コンパイルエラーは発生しませんが、AbstractSampleにエラーが発生してほしい。そしてまた、Sample#sampleMehodC() を追加した場合、必要なメソッドが実装されていないというエラーは SampleImpl に発生するが、AbstractSample に発生して欲しい…。

そんなん、無いですよねー…。