web-dev-qa-db-ja.com

ロンボク-コンストラクター入力パラメーターでフィールドの注釈を保持する

ロンボクは、コンストラクターの自動生成中にフィールドの注釈を見逃します。コンストラクターの入力パラメーターでフィールドの注釈を保持する方法はありますか?

コンストラクタを生成するクラス、

@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyHandler")
    private final SomeHandler handler;
}

生成されたクラス:

public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyField")
    private final SomeHandler handler;

    @Inject
    public Test(final String field, final SomeHandler handler) {
        this.field = field;
        this.handler = handler;
    }
}

希望クラス:

public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyHandler")
    private final SomeHandler handler;

    @Inject
    public Test(@Named("MyField")final String field, 
                @Named("MyHandler")final SomeHandler handler) {
        this.field = field;
        this.handler = handler;
    }

}
25
sidss

バージョン v1.18.4 Lombokでは、特定の注釈をコピーするためのサポートが追加されました。つまり、次の設定をlombok.config

lombok.copyableAnnotations += com.google.inject.name.Named

次のLombokアノテーションをクラスに適用します。

@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class Hello {
    @NonNull @Named("my-name") String name;
}

@Namedアノテーションは、生成されたコンストラクター引数にコピーする必要があります。

12
mladzo

そのような機能はなく、誰も気にしないようです。私は 一度提案した とそれを実装し始めましたが、あきらめました(要求がなく、作業が多すぎます)。

それは次のようになります

@RequiredArgsConstructor(onConstructor=@__(@Inject))
public class Something {
    @OnConstructor(@Named("userName"))
    private final String userName;

    @OnConstructor(@Named("userPassword"))
    private final String userPassword;

    private final int anotherField;

    private final int yetAnotherField;
}

または多分ちょうど

@RequiredArgsConstructor(
     onConstructor=@__(@Inject),
     moveToConstructorArg=@__(@Named))
public class Something {
    @Named("userName")
    private final String userName;

    @Named("userPassword")
    private final String userPassword;

    private final int anotherField;

    private final int yetAnotherField;
}

または、おそらくすべてのlombok.configアノテーションをコンストラクタに移動したいので、@Namedを使用して制御することもできます。

私は恐れている、もしあなたがそれを望むなら、あなた自身でそれをしなければならない(私の不完全な実装はあなたを少し助けるかもしれない)。

FTR: 機能リクエスト があります。

11
maaartinus