1. ホーム
  2. java

[解決済み] アノテーションのフィールドにデフォルトのヌル値を設定する際の不具合

2023-05-27 13:36:30

質問

属性値は一定でなければならない」というエラーが発生するのはなぜですか。これは null は定数ではないですか?

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeInterface {
    Class<? extends Foo> bar() default null;// this doesn't compile
}

どのように解決するのですか?

なぜかわからないのですが JLS は非常にわかりやすい。

 Discussion

 Note that null is not a legal element value for any element type. 

そして、デフォルト要素の定義は

     DefaultValue:
         default ElementValue

残念ながら、新しい言語機能(Enumsと現在のAnnotations)は、言語仕様を満たしていない場合、非常に役に立たないコンパイラのエラーメッセージが表示されることを発見し続けました。

編集: 少しググってみると を見つけました。 をJSR-308で見つけ、この状況でnullを許容することを主張している。

我々はこの提案に対するいくつかの可能な反論を記します。

この提案は、これまで不可能だったことを可能にするものではありません。

プログラマが定義した特別な値は、「なし」「初期化されていない」「nullそのもの」などを意味するかもしれないnullよりも、より良いドキュメントを提供します。

提案はよりエラーを起こしやすいものです。明示的な値に対するチェックを忘れるよりも、nullに対するチェックを忘れる方がはるかに簡単です。

提案は標準的なイディオムをより冗長にする可能性があります。現在、注釈のユーザーだけが、その特別な値についてチェックする必要があります。この提案により、アノテーションを処理する多くのツールは、ヌルポインター例外をスローしないように、フィールドの値がヌルであるかどうかをチェックする必要があります。

最後の 2 つのポイントだけが、quot;そもそもなぜそうしないのか、に関連していると思います。私は、開発者のコードを明確にするためにその種のチェックを行う必要があるのは、むしろその逆ではなく、アノテーション プロセッサやその他のフレームワーク コードの仕事であると考える傾向がありますが、それは確かにそれを変更することを正当化するのが難しくなります。