首页 > 解决方案 > 如何在构造函数上使用 lombok 的 @Tolerate

问题描述

@Tolerate注释是一个实验特性,其中lombok目标类型是方法或构造函数。龙目岛网站提到:

任何方法或构造函数都可以用 @Tolerate 注释,并且 lombok 将表现得好像它不存在一样。

它说明了一个 setter 方法的示例:

@Setter
private Date date;

@Tolerate
public void setDate(String date) {
    this.date = Date.valueOf(date);
}

在上面的示例中,如果我们没有添加 @Tolerate,那么 lombok 将不会生成setDate(Date date),因为已经存在同名的方法(即使参数类型不同)。因此,从这个例子中可以清楚地看出它是如何作用于一个方法的。

但我无法理解如何将此注释用于构造函数。

@AllArgsConstructor
public class One {
    private int id;
    private String name;

    // adding @Tolerate here does nothing. 
    public One(int a, int b) {
    }
}

在上面的代码中,即使存在另一个参数数量相同但类型不同的构造函数,lombok 也会生成一个全参数构造函数。

那么,我们如何@Tolerate在构造函数的上下文中使用呢?

标签: javalombok

解决方案


,和注释创建构造函数(一个构造函数用于 case 中的所有必需参数@Data,一个构造函数用于和case中的所有参数)。但是,如果不存在其他构造函数,它们只会执行这些操作。如果您创建自己的构造函数,,并且不会创建它们的构造函数,除非您使用 . 注释自己的构造函数。@Value@Builder@Data@Value@Builder@Data@Value@Builder@Tolerate

简而言之,在构造函数上只有与,或@Tolerate一起使用时才会有所不同。如果您将它与,或一起使用,它没有任何效果,就像 Gautham 注意到的那样。@Data@Value@Builder@NoArgConstructor@AllArgsConstructor@RequiredArgsConstructor

例子:

@Value
public class Main {
    private int id;
    private String name;
    
    @Tolerate // Now the allArgsConstructor will be created. If you omit the annotation, no allArgsConstructor will be created.
    public Main(String name) {
        this.name = name;
        this.id = 0;
    }
}

推荐阅读