龙目岛: 在@allargsConstruction 中省略一个字段?

如果我使用 龙目岛指定 @ AllArgsConstruction,它将生成一个构造函数,用于设置所有声明的(非 final,非 static)字段。 是否有可能省略一些字段,并且这个留下为所有其他字段生成的构造函数?

106787 次浏览

不,这不可能。有一个创建 @SomeArgsConstructor的特性请求,您可以在其中指定相关字段的列表。

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

或者,您可以使用 @RequiredArgsConstructor。这将为所有属于 @NonNullfinal的字段添加一个构造函数。

看看 文件

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

为了以防万一,初始化的 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");

这可以通过使用来自 Lombok@ RequredArgsConstruction@ 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");

龙目岛是用来处理 POJO 的样板代码的。定制的构造函数/setter/getters/toString/copy 等不在代码的样板端。对于这些情况,每个 JavaIDE 都提供易于使用的代码生成器来帮助您立即完成工作。 在你的情况下

public MyClass(String firstName, String lastName) {....}

比一个假设更具可读性,也更有意义:

@AllArgsConstructor(exclude = "id", exclude = "phone")

玩得开心!