C#からJavaに移った際に、virtual とか ref、out などいくつか修飾子が無くて、実装者の意図を読み取りづらいなーなんて思った事がありました。
そういう言語仕様なのでしょうがないと言ってしまえばそうなのですが、
C#の方が後発の言語ですし、そちらにあるという事は、あった方が良いと感じる人が多かったんでしょ!!
ってことで、なんちゃって C# like な書き方ができるよう、以下のような Annotation を作っちゃいました。
本当は、コンパイルエラーまで出てくれればベストなのですが、さすがにそこまでは出来ません。
ですが、カプセル化をしつつも実装者の意図を明示的に使用者に伝えられるという点で、チーム開発を行っているような現場では有効なんじゃないかな~
virtual.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The virtual keyword is used to modify a method, declaration and allow for it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it.<br>
*
* virtual キーワードは、メソッドを修飾し、派生クラスでオーバーライドできるようにするために使用します。 たとえば、このメソッドは、このメソッドを継承するクラスでオーバーライドできます。
*
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface virtual {
}
@Retention(RetentionPolicy.SOURCE)
にしているのでコンパイル時には破棄され、余計な注釈は残らないはず!!
適用イメージはこんな感じ
sample.java
@internal class Sample {
/**
* ほげほげ
**/
public @virtual hoge(@ref Parameter arg1, @out Parameter arg2) {
...
}
}
今回は virtual を例にしましたが、他にも以下のようなものを用意いしておくと、開発者の意図せぬ使われ方を抑止する事ができるかもしれないです。
もちろんC#に固執する必要もないので、チーム内でルールを決めて annotation を作ってもよいですね。
修飾子 | 概要 |
---|---|
virtual | いわゆる pure virtual method である事を明示する修飾子。ovrride される事をある程度前提にクラス全体を設計しているとかなんとか |
ref | 引数を参照渡しをしている事を明示的に行う為の修飾子ですが、メソッド内部で引数の値が書き換えられる事があり得る場合に使うとか |
out | 引数をメソッド内部で初期化して返すとか |
internal | 同一プロジェクトのみ使って良いとか |
threadSafe | スレッドセーフである事を明示的に示すとか |
思いつきでやってみたので、色々突っ込みどころがあるかと思いますがご容赦を。。。