Java Lombok:在@AllArgsConstructor中省略一个字段?

use*_*823 51 java syntax constructor field lombok

如果我使用Lombok指定@AllArgsConstructor,它将生成一个构造函数,用于设置所有声明的(非最终的,非静态的)字段.是否可以省略某些字段,这会为所有其他字段留下生成的构造函数?

Roe*_*ker 74

不,这是不可能的.有一个功能请求可以创建一个@SomeArgsConstructor,您可以在其中指定所涉及字段的列表.

完全披露:我是Lombok开发的核心项目之一.

  • 与使用 ```@EqualsAndHashCode.Exclude``` 一样,您可以在字段前面添加 ```@AllArgsConstructor.Exclude``` 。 (15认同)
  • @SomeArgsConstructor 在 2020 年可用吗? (11认同)
  • 所以答案现在已经快四年了,任何解决方法? (7认同)
  • 现在5岁了,@ SomeArgsConstructor还在地平线上吗? (4认同)
  • 在lombok 1.16.20中错过了@ SomeArgsConstructor` (3认同)
  • 现在已经有将近5年的历史了,我希望该功能可以排除某些带有注释的字段。 (2认同)
  • 我希望我们能在即将到来的 2021 年看到这样的构造函数(看起来功能请求因我不明白的原因被拒绝) (2认同)

der*_*itz 52

或者你可以使用@RequiredArgsConstructor.这增加了项目,是指各个领域的构造函数@NonNullfinal.

文档

  • 这是一个很好的解决方法,使用@NonNull。但请注意,这不适用于具有默认值的字段。 (2认同)

Shu*_*nia 13

这可以使用 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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以创建一个对象,如下所示:

Employee employee = new Employee("FirstName", "LastName", 27, "Address");
Run Code Online (Sandbox Code Playgroud)


enk*_*ara 11

在某些情况下绕过它的一个好方法是使用 @Builder

  • 我们可以说“一种方式”,而不是“一种好方式”。如果您希望“AllArgsConstructor”保证用户提供所有(必需)成员,则 std 构建器_不是_这样做的方法。 (2认同)

Fer*_*nch 8

以防万一它有帮助,初始化的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);
Run Code Online (Sandbox Code Playgroud)

这对于集合或其他可变类尤其有意义。

此解决方案可以与此处其他解决方案一起使用,关于使用@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");
Run Code Online (Sandbox Code Playgroud)

  • 重要补充:“初始化的 **final** 字段被排除” -&gt; 如果该字段仅初始化但不是最终的,则构造函数(由 AllArgsConstructor 生成)也将使用此字段生成:) (2认同)