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

Posted

技术标签:

【中文标题】Java Lombok:在@AllArgsConstructor 中省略一个字段?【英文标题】:Java Lombok: Omitting one field in @AllArgsConstructor? 【发布时间】:2014-07-08 19:12:22 【问题描述】:

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

【问题讨论】:

那时它不会是一个全参数的ctor。 当然可以。也许龙目岛有一些解决方案? 【参考方案1】:

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

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

【讨论】:

@SomeArgsConstructor 在 lombok 1.16.20 中错过 @SomeArgsConstructor 在 2020 年可用吗? 希望我们能在即将到来的 2021 年看到这样的构造函数(看起来功能请求因为我不明白的原因被拒绝了) 查看关于 @RequiredArgsConstructor 的答案,因为该注释可能满足 OP 问题的大多数用例。 @EqualsAndHashCode.Exclude 一样,您可以在字段前面添加@AllArgsConstructor.Exclude【参考方案2】:

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

见documentation

【讨论】:

这是一个很好的解决方法,使用@NonNull。但请注意,这不适用于具有默认值的字段。 这对我来说效果很好,我什至用 @Transient 标记了省略的字段,以避免它被 java 持久层跟踪,因为它在我的 DAO 中。【参考方案3】:

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

【讨论】:

在此处查看示例:***.com/a/39920328/363573 让我们说“a 方式”,而不是“a good 方式”。如果您希望 AllArgsConstructor 保证用户提供所有(必需的)成员,则 std 构建器不是这样做的方式。 我说在某些情况下,我仍然坚持【参考方案4】:

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

【讨论】:

重要补充:“已初始化的 final 字段被排除” -> 如果该字段仅被初始化但不是最终的,则将使用此字段生成构造函数(由 AllArgsConstructor 生成)好吧:) 您好,我想问一下是否知道如何生成两种类型的构造函数,例如一种包含 string s 和 int i ,一种包含 string s 和 string F 。 Lombok 旨在为常见情况生成代码,而不是为特定场景生成代码。您应该明确编码特定的构造函数。 您的回答帮助很大:如果您要排除的字段是最终字段,因为它们是常量。【参考方案5】:

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

【讨论】:

嗨,我想问一下是否知道如何生成两种类型的构造函数,例如一种包含年龄和姓氏,一种包含地址和年龄 嗨@CompteGmail,最好单独定义构造函数

以上是关于Java Lombok:在@AllArgsConstructor 中省略一个字段?的主要内容,如果未能解决你的问题,请参考以下文章

优雅的Java工具库Lombok

使用 `lombok` 注释和 Java JDK 8 在内存中编译 Java 类

Lombok——一款Java构建工具,“懒人”必备!!(idea版)

Lombok插件

Java简化代码神器-Lombok

Lombok简化Java代码