龙目岛 - 在构造函数输入参数中保留字段的注释

2022-09-01 05:16:26

龙目岛在自动生成构造函数时缺少字段的注释。有没有办法在构造函数输入参数中保留字段的注释?

生成构造函数的类,

@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;
    }

}

答案 1

在版本v1.18.4中,龙目岛增加了对复制特定注释的支持。这意味着,如果将以下设置设置为:lombok.config

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

并将以下龙目岛注释应用于您的班级:

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

应将注释复制到生成的构造函数参数中。@Named

限制:当无法将注释放在字段上或字段上的注释覆盖构造函数初始化时,这不起作用


答案 2

没有这样的功能,看起来没人在乎。我曾经提出过一次并开始实施它,但放弃了(没有需求和太多的工作)。

它可能看起来像

@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:现在有一个功能请求


推荐