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

46

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

}

1
我认为这个从未按照以下链接实现:https://groups.google.com/forum/#!topic/project-lombok/2vaujDkV8Nw - Cheetah
1
@Cheetah,恐怕你是对的。我几年前开始实现它,但它比我想象的要复杂。没有人关心,我发现我自己只需要很少用到它,并且有一个解决方法。 - maaartinus
2个回答

59
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

目前还没有这种功能,并且似乎没有人关心。 我曾经提出过这个想法并开始实施,但最终放弃了(因为没有需求且工作量太大)。

可能会看起来像:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接