【问题标题】:Lombok - retain field's annotation in constructor input paramsLombok - 在构造函数输入参数中保留字段的注释
【发布时间】:2017-07-20 11:00:31
【问题描述】:

Lombok 在自动生成构造函数时错过了字段的注释。有没有办法在构造函数输入参数中保留字段的注释?

生成构造函数的类,

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

}

【问题讨论】:

标签: java guice lombok


【解决方案1】:

没有这样的功能,看起来没人在乎。我proposed it once并开始实现它,但放弃了(没有需求和太多工作)。

看起来像

@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:现在有feature request

【讨论】:

    【解决方案2】:

    v1.18.4Lombok 版本中增加了对复制特定注释的支持。意思是,如果您将以下设置设置为lombok.config:

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

    并将以下 Lombok 注释应用到您的班级:

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

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

    限制:annotation can't be put on a fieldannotation on a field overrides constructor initialization 时这不起作用

    【讨论】:

    • 你拯救了我的一天
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多