繁体   English   中英

如何在构造函数上使用 lombok 的 @Tolerate

[英]How to use lombok's @Tolerate on a constructor

@Tolerate注释是lombok中的一项实验性功能,其中目标类型是 Method 或 Constructor。 龙目岛网站提到:

任何方法或构造函数都可以用 @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呢?

@Data@Value@Builder注释创建构造函数( @Data情况下所有必需的 arguments 的构造函数,@ @Value@Builder情况下所有 arguments 的构造函数)。 但是,如果不存在其他构造函数,它们只会执行这些操作。 如果您创建自己的构造函数,@ @Builder @Value @Data创建它们的构造函数,除非您使用@Tolerate注释自己的构造函数。

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

例子:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM