如果我使用Lombok来指定@AllArgsConstructor,它将生成一个构造函数来设置所有已声明的(不是final,也不是static)字段。是否可能省略某些字段,并使生成的构造函数仅适用于所有其他字段?
不,那是不可能的。有一个特性请求可以创建一个@SomeArgsConstructor
,您可以在其中指定涉及到的字段列表。
完全透明:我是核心Project Lombok开发人员之一。
@SomeArgsConstructor
。 - Grigory Kislin@RequiredArgsConstructor
的答案,因为该注释可能满足大多数 OP 问题的用例。 - Gordon Bean@EqualsAndHashCode.Exclude
一样,你可以在字段前加上 @AllArgsConstructor.Exclude
。 - Erick Audet或者,您可以使用@RequiredArgsConstructor
。这将为所有字段添加一个构造函数,这些字段都是@NonNull
或final
。
请参阅文档。
@Transient
标记省略的字段,以避免它被Java持久层跟踪,因为它在我的DAO中。 - Encryption如果有帮助的话,已初始化的 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);
这在集合或其他可变类中尤其有意义。
此解决方案可以与此处的其他解决方案一起使用,该解决方案涉及使用@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");
在某些情况下,一个很好的解决方法是使用@Builder
。
AllArgsConstructor
来保证用户提供所有(必需的)成员,则使用标准构建器 不是 正确的方法。 - towi这可以使用 Lombok 中的两个注释来完成:
请参见以下示例:
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");
Lombok旨在为您的POJO处理样板代码。自定义构造函数/设置器/获取器/toString/copy等不属于样板代码的一部分。对于这些情况,每个Java IDE都提供了易于使用的代码生成器,帮助您快速完成任务。 在您的情况下,
public MyClass(String firstName, String lastName) {....}
比起一个假设性的语句,这个更易读且更有意义:
@AllArgsConstructor(exclude = "id", exclude = "phone")
玩得开心!
@Data
@Entity
@Table(name = "VetFiles")
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
public class FileInfo implements Serializable {
private static final long serialVersionUID = 6719621520531075147L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private final String name;
private final String url;
@ManyToOne
private Thing thing;