122

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

4

5 回答 5

159

不,那是不可能的。有一个功能请求来创建一个@SomeArgsConstructor您可以指定所涉及字段列表的位置。

全面披露:我是 Lombok 项目的核心开发人员之一。

于 2014-05-21T08:44:13.353 回答
137

或者,您可以使用@RequiredArgsConstructor. 这为所有字段添加了一个构造函数 要么@NonNull要么final

请参阅文档

于 2016-12-19T09:50:26.343 回答
13

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

于 2018-09-18T15:31:52.300 回答
12

以防万一它有帮助,初始化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");
于 2020-12-17T08:07:18.410 回答
6

这可以使用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");
于 2021-06-24T15:44:34.940 回答