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

tjrkku2a  于 2023-05-27  发布在  Java
关注(0)|答案(6)|浏览(476)

如果我使用Lombok指定 @AllArgsConstructor,它将生成一个构造函数来设置所有声明的(非final,非static)字段。是否可以省略一些字段,而将生成的构造函数留给所有其他字段?

ioekq8ef

ioekq8ef1#

不,这不可能。有一个创建@SomeArgsConstructor的功能请求,您可以在其中指定所涉及字段的列表。
全面披露:我是Lombok项目的核心开发人员之一。

nwnhqdif

nwnhqdif2#

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

jckbn6z7

jckbn6z73#

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

khbbv19g4#

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

oyjwcjzk

oyjwcjzk5#

这可以使用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");
s4n0splo

s4n0splo6#

Lombok旨在为您的POJO处理样板代码。自定义的构造函数/setters/getters/toString/copy等不在代码的样板部分。对于这些情况,每个Java IDE都提供了易于使用的代码生成器来帮助您立即完成任务。在你的情况下

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

比一个假设更容易理解,也更有意义:

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

玩得开心!

相关问题