web-dev-qa-db-ja.com

ロンボクでの構文 `@__()`はどういう意味ですか?

私は2か月間、ロンボクと協力して積極的に使用しています。 With Java私はもう少し慣れています。しかし、初めて、この言語で次の構文構造に直面しました。

@RequiredArgsController(onController = @__(@Autowired))
                                       ^^^

それはどういう意味ですか、そしてそれはどのようにコンパイルされますか?

15
Andrew Tobilko

これは実験的なLombok構文であり、_Class<?>[]_を使用するのではなく、複数のアノテーションを参照するときに間接層をサポートするために作成されました。

構文は少し奇妙です。 3つのonX機能のいずれかを使用するには、コンストラクター/メソッド/パラメーターに適用されるアノテーションを@__(@AnnotationGoesHere)でラップする必要があります。複数のアノテーションを適用するには、@__({@Annotation1, @Annotation2})を使用します。注釈自体にも明らかにパラメータを含めることができます。

https://projectlombok.org/features/experimental/onX.html

ロンボク開発者からの説明 Roel Spilker

その理由は、javacは解析フェーズですでにアノテーションを解決しており、アノテーションが無効であると判断できる場合はエラーを出すためです。存在しない注釈_@___を使用することにより、それが偽物であると判断できず(注釈プロセッサによって作成された可能性があります)、すぐにエラーが発生することはありません。これにより、Lombokは作業を行い、コードから_@___を削除する時間が与えられます。

14
OrangeDog

これは、生成されたコンストラクター(コントローラーではない)にも_@Autowired_アノテーションが追加され、Springがその魔法を実行できることを意味します。 lombokを使用すると、次のようなコードを記述できます。

_@RequiredArgsConstructor(onConstructor=@__(@Autowired(required=true)))
public class FooController {
    private final FooService service;
    interface FooService {}
}
_

そしてlombokはそれを変換します コンパイル中

_public class FooController {
    private final FooService service;
    @Autowired(required=true)
    public FooController(FooService service) {
        this.service = service;
    }
}
_

_@___は、注釈のタイプ制限を克服するために使用されます。

_@interface MultipleAnnotations {
    Annotation[] value();
}
_

すべての注釈のスーパータイプ自体が注釈ではないため、機能しません。

_@interface MultipleAnnotations {
    Class<? extends Annotation>[] value();
}
_

注釈にパラメータを許可しません:@MultipleAnnotations(SomeAnnotation.class)

7
zapl