0

I want to create an annotation that restricts a developer from specifying null as a parameter, which has been annotated with @NoNull

For example, if I create this method:

public void printLine(@NoNull String line) {
    System.out.println(line);
}

On a method call, I want an error to appear if the user specifies null for line: printLine(null);

I have been using APT for only a little bit of time, and am wondering how to do this (if possible)?

This is the annotation I have created so far:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
public @interface NoNull {}
4

3 に答える 3

3

ランタイム値を実際に処理しているため、コンパイル時間の確認は困難です。このようなものをチェックするためのコードを自動的に追加するアノテーションを作成する場合は、プロジェクトlombokを確認する必要があります。

http://projectlombok.org/

アノテーションプロセッサを使用してBeanにコードを追加し、さまざまなことを実行します。

例えば:

@Getter @Setter
private int id;

アノテーションプロセッサは、自動的にget/setメソッドをBeanに追加します。

nullチェックはないと思いますが、これを追加して投稿できるはずです。

もう1つのオプションは、検証jsrを使用することです。これには、実行時に明示的に検証する必要がありますが、プロキシまたはAOPを使用してこれを実行できます。

@NotNull @Min(1)
public void setId(Integer id)
于 2012-09-04T21:43:43.083 に答える
2

要点は、可読性のためだけに注釈を使用することではなく、APT を使用してコンパイル時に注釈を強制することです。

null がランタイム アーティファクトであることを考えると、「コンパイル時」に null チェックを強制する方法がわかりません。

代わりに、クラスを変更する必要があります。aptは、少なくともそれ自体では、これを行うためのツールではありません。ソースファイルから注釈付き要素に関する情報を抽出するために存在します。ただし、@Null制限を適用するには、実行中のクラスを変更する必要があります。

できることの 1 つは、aptを使用して注釈付きパラメーターに関する情報を抽出し、aspectjなどのツールを使用して実行時にそれらのクラスを変更し、パラメーター値を確認することです。

しかし、それは 1 つの SO の質問には広すぎるトピックです。

于 2012-09-04T21:30:46.587 に答える
0

@Nullable、@Nonnull はパッケージに配置されています: javax.annotation

グアバをチェックしてください。型の安全性が優れていることがいくつかあり ます。 http://code.google.com/p/guava-libraries/wiki/GuavaExplained

于 2012-09-04T21:16:51.273 に答える