Java Lombok:在@AllArgsConstructor 中省略一个字段?
Posted
技术标签:
【中文标题】Java Lombok:在@AllArgsConstructor 中省略一个字段?【英文标题】:Java Lombok: Omitting one field in @AllArgsConstructor? 【发布时间】:2014-07-08 19:12:22 【问题描述】:如果我使用 Lombok 指定 @AllArgsConstructor,它将生成一个构造函数来设置所有声明的(不是最终的,不是静态的)字段。 是否可以省略某些字段,并为所有其他字段留下生成的构造函数?
【问题讨论】:
那时它不会是一个全参数的ctor。 当然可以。也许龙目岛有一些解决方案? 【参考方案1】:不,那是不可能的。有一个功能请求创建一个@SomeArgsConstructor
,您可以在其中指定相关字段的列表。
全面披露:我是 Project Lombok 的核心开发人员之一。
【讨论】:
@SomeArgsConstructor
在 lombok 1.16.20 中错过
@SomeArgsConstructor 在 2020 年可用吗?
希望我们能在即将到来的 2021 年看到这样的构造函数(看起来功能请求因为我不明白的原因被拒绝了)
查看关于 @RequiredArgsConstructor
的答案,因为该注释可能满足 OP 问题的大多数用例。
与@EqualsAndHashCode.Exclude
一样,您可以在字段前面添加@AllArgsConstructor.Exclude
。【参考方案2】:
或者,您可以使用@RequiredArgsConstructor
。这将为 @NonNull
或 final
的所有字段添加一个构造函数。
见documentation
【讨论】:
这是一个很好的解决方法,使用@NonNull。但请注意,这不适用于具有默认值的字段。 这对我来说效果很好,我什至用@Transient
标记了省略的字段,以避免它被 java 持久层跟踪,因为它在我的 DAO 中。【参考方案3】:
在某些情况下绕过它的好方法是使用@Builder
【讨论】:
在此处查看示例:***.com/a/39920328/363573 让我们说“a 方式”,而不是“a good 方式”。如果您希望AllArgsConstructor
保证用户提供所有(必需的)成员,则 std 构建器不是这样做的方式。
我说在某些情况下,我仍然坚持【参考方案4】:
以防万一,已初始化的 final
字段被排除在外。
@AllArgsConstructor
class SomeClass
final String s;
final int i;
final List<String> list = new ArrayList<>(); // excluded in constructor
var x = new SomeClass("hello", 1);
这对于集合或其他可变类尤其有意义。
这个方案可以和other solution here一起使用,关于使用@RequiredArgsConstructor
:
@RequiredArgsConstructor
class SomeClass2
final String s;
int i; // excluded because it's not final
final List<String> list = new ArrayList<>(); // excluded because it's initialized
var x = new SomeClass2("hello");
【讨论】:
重要补充:“已初始化的 final 字段被排除” -> 如果该字段仅被初始化但不是最终的,则将使用此字段生成构造函数(由 AllArgsConstructor 生成)好吧:) 您好,我想问一下是否知道如何生成两种类型的构造函数,例如一种包含 string s 和 int i ,一种包含 string s 和 string F 。 Lombok 旨在为常见情况生成代码,而不是为特定场景生成代码。您应该明确编码特定的构造函数。 您的回答帮助很大:如果您要排除的字段是最终字段,因为它们是常量。【参考方案5】:这可以使用来自 lombok @RequiredArgsConstructor 和 @NonNull 的两个注解来完成。
请看下面的例子
package com.ss.model;
import lombok.*;
@Getter
@Setter
@RequiredArgsConstructor
@ToString
public class Employee
private int id;
@NonNull
private String firstName;
@NonNull
private String lastName;
@NonNull
private int age;
@NonNull
private String address;
然后你可以创建如下构造函数
Employee employee = new Employee("FirstName", "LastName", 27, "Address");
【讨论】:
嗨,我想问一下是否知道如何生成两种类型的构造函数,例如一种包含年龄和姓氏,一种包含地址和年龄 嗨@CompteGmail,最好单独定义构造函数以上是关于Java Lombok:在@AllArgsConstructor 中省略一个字段?的主要内容,如果未能解决你的问题,请参考以下文章
使用 `lombok` 注释和 Java JDK 8 在内存中编译 Java 类