首页 > 解决方案 > 在构造函数或类声明上注释 @Builder 有什么区别?(龙目岛)

问题描述

这两种用法有什么区别@Builder

import lombok.*;

class BuilderAnnotationOnConstructor{

    Integer fieldOne, fieldTwo;

    @Builder
    public BuilderAnnotationOnConstructor(int fieldOne, int fieldTwo) {
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }
}

@Builder
class BuilderAnnotationOnClass{

    Integer fieldOne, fieldTwo;

    public BuilderAnnotationOnClass(int fieldOne, int fieldTwo) {
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }
}

它们编译和运行都很好,但是当注释在类声明上时,我注意到第二种情况下的奇怪行为(例如,在我的一个大型项目中,属性值分配给错误/交换的变量名;不幸的是,我无法重现这个简单示例中的这些行为)

标签: javabuilderlombok

解决方案


来自龙目岛文档:

*既然“方法”模式已经明确,在构造函数上添加@Builder注解类似;实际上,构造函数只是具有调用它们的特殊语法的静态方法:它们的“返回类型”是它们构造的类,它们的类型参数与类本身的类型参数相同

最后,将@Builder 应用到一个类就好像你将@AllArgsConstructor(access = AccessLevel.PACKAGE) 添加到该类并将@Builder 注释应用到这个全参数构造器一样。这仅在您自己没有编写任何显式构造函数时才有效。如果您确实有显式构造函数,请将 @Builder 注释放在构造函数上而不是类上。请注意,如果您将@Value@Builder放在一个类上,想要生成“win”的包私有构造函数会@Builder获胜并抑制想要生成的构造函数@Value。*

来自https://projectlombok.org/features/Builder


推荐阅读