LoginSignup
2
2

More than 5 years have passed since last update.

annotationでC#の修飾子の代替え

Last updated at Posted at 2015-06-02

C#からJavaに移った際に、virtual とか refout などいくつか修飾子が無くて、実装者の意図を読み取りづらいなーなんて思った事がありました。
そういう言語仕様なのでしょうがないと言ってしまえばそうなのですが、
C#の方が後発の言語ですし、そちらにあるという事は、あった方が良いと感じる人が多かったんでしょ!!
ってことで、なんちゃって C# like な書き方ができるよう、以下のような Annotation を作っちゃいました。
本当は、コンパイルエラーまで出てくれればベストなのですが、さすがにそこまでは出来ません。 :sob:
ですが、カプセル化をしつつも実装者の意図を明示的に使用者に伝えられるという点で、チーム開発を行っているような現場では有効なんじゃないかな~ :neutral_face:

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)にしているのでコンパイル時には破棄され、余計な注釈は残らないはず!!

2.png

適用イメージはこんな感じ

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 スレッドセーフである事を明示的に示すとか

思いつきでやってみたので、色々突っ込みどころがあるかと思いますがご容赦を。。。:weary:

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2