在构造函数或 class 声明上注释 @Builder 有什么区别? (龙目岛)

What is the difference of annotating @Builder on constructor or on class declaration? (Lombok)

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

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

来自龙目岛文档:

*现在 "method" 模式已经清楚了,将 @Builder 注解放在构造函数上的功能类似;实际上,构造函数只是具有调用它们的特殊语法的静态方法:它们的 'return type' 是它们构造的 class,并且它们的类型参数与 class 的类型参数相同本身

最后,将 @Builder 应用于 class 就好像您将 @AllArgsConstructor(access = AccessLevel.PACKAGE) 添加到 class 并将 @Builder 注释应用于此所有 -参数构造函数。这仅在您自己没有编写任何显式构造函数的情况下才有效。如果您确实有显式构造函数,请将 @Builder 注释放在构造函数上而不是 class 上。请注意,如果将 @Value@Builder 都放在 class 上,@Builder 想要生成 'wins' 的包私有构造函数并抑制 'wins' 的构造函数 @Value想做。 *

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