ロンボクは、コンストラクターの自動生成中にフィールドの注釈を見逃します。コンストラクターの入力パラメーターでフィールドの注釈を保持する方法はありますか?
コンストラクタを生成するクラス、
@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;
}
}
バージョン 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
アノテーションは、生成されたコンストラクター引数にコピーする必要があります。
そのような機能はなく、誰も気にしないようです。私は 一度提案した とそれを実装し始めましたが、あきらめました(要求がなく、作業が多すぎます)。
それは次のようになります
@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: 機能リクエスト があります。