2009-05-13 8 views
5

私は最近、私のプロジェクトにJSR305のためのRIを追加しましたし、このように私のインターフェイスに注釈を追加されています:JSRの精神でこれはJSR305のjavax.annotationを使用する正しい方法ですか?

public interface AccountService 
{ 
    @Nullable AccountResult consolidate(@Nonnull Date from, @Nonnull Date to) 
} 

(ここで説明するように)、あなたは私は思いますインタフェースでアノテーションを使用することによってアノテーションを誤用することはありますか?返り値がnullでもかまいませんが、@ Nullableはメソッド "consolidate"にもっと適用されると思います。私はコーディング時にインターフェイスのコードが私の指導的な光なので実装に追加しません。

+1

あなたが表現しようとしている意味以外のnullableメソッドの別の解釈は何でしょうか(戻り値はnullでもかまいません)? – Thilo

答えて

1

私はそれがなぜアノテーションを追加するのかによって異なると思います。

インターフェイスの実装者が意図した設計を知っているように参照用に追加しているだけなら、それは問題ありません。

私は、トランザクション処理とセキュリティロールの強制に注釈を使用します。したがって、注釈は実装レベルにあります。これは、Springコンテナ内のAOPプロセッサが、この注釈の有無をテストし、適切なプロキシクラスを適用してトランザクション境界を定義する、または特定のメソッド呼び出しを許可されていることを確認できることです。

アノテーションが存在するかどうかに関係なく、処理をキー入力する予定がある場合は、実装に注釈が付いていることを確認してください。参照のためのものであれば、インターフェイスだけに注釈を付けることができます。

6

Stringの厳密なサブクラスとして '@NonNull String'が表示されます。結局のところ、null以外のStringは間違いなく 'instanceof' '@ Nullable String'ですが、 '@Nullable String'のインスタンスは '@NonNull String'のインスタンスではないかもしれません(たとえば、null)。

このように見ると、@ Nullableと@NonNullは型情報なので、インターフェイスでは完全に合理的です。実装者は、nullを返す可能性があり、入力nullについて心配する必要がないことを示しています。また、nullを渡す必要がないことを呼び出し側に示しています。

もちろん、これはすべて非常に合理的ですが、vanilla javac v1.6では、実際のタイプに対して型の安全性を強制する方法はありません。しかし、誰かが夢を見ることができる、またはpmdやfindbugsのようなものを使って、これらの注釈を検証する仕事をすることができます。

@NonNullアノテーションと@Nullableアノテーションは完全な無効型システムでは不十分です。私はJSR305がこれに対処しない理由を本当に知りませんが、3番目のタイプがあります: "@MaybeNull"。ジェネリックスのパラメータの中に表示されます。それ以外の場所では、@ Nullableと同じ意味を持ちます。

public static void addIfNotNull(リスト< @MaybeNull T>リスト、@Nullable Tアイテム){ if(item!= null)list.add(item); }

最初の 'T'の注釈に「@Nullable」がある場合は、非nullリストを渡すことができず、むしろ無駄なAPIになります。一方、@ NonNullの場合、nullableリストを渡すことはできませんでした。実際には、そこに移動しても問題はありません。(A)NullPointerExceptionを引き起こすことはありません。(B)never注釈に違反します。だから、あなたは表現する方法が必要です:この特定の 'T'がNullableかどうかは気にしません。私はそれを読んだときにヌルチェックし、ヌルを書くことは決してないので、問題ではありません。

@MaybeNullと@Nullableの違いは、 '?ジェネリックスでNumberとNumberを拡張します。ジェネリックの外では同じことを意味しますが、ジェネリックでは違いがあります。

だから、すぐに堅固な型検査の希望を保ち続けないでください。

@Inheritedはクラスに対してのみ機能しますが、注釈付きの戻り値の型と注釈付きのパラメータでは似たようなものがあります。

+0

@MaybeNullは私が知る限り、JSR305から廃止されました。また、ジェネリック型の注釈はJSR308によって指定されます.JSR308はJava7で利用可能です。 (注:事前定義されたアノテーションの全コレクションではなく、ジェネリックタイプに注釈を付けることができる** **事実**のみ) –

関連する問題