java - 如何为第三方 POJO 创建构建器?

标签 java lombok

如何为第三方类创建 Lombok 构建器(即我无法修改其源代码)?

我有一个无法更改的现有类:

public class ThirdPartyPojo {
    // one of many properties
    private String name;

    public ThirdPartyPojo() {
        // default no-args constructor
    }

    String getName() {
        return this.name;
    }

    void setName(String name) {
        this.name = name;
    }

    // many more getters and setters
}

现在我想创建一个 @Builder 以便我获得一个流畅的构建器 API 来简化具有默认值的 ThirdPartyPojo 的实例化。

这是我尝试过的:

@Builder
public class ThirdPartyPojoBuilder extends ThirdPartyPojo {

    @Default
    private String name = "default name";

    // many more default values for other properties
}

代码可以编译,我可以引用生成器,例如

ThirdPartyPojo pojoWithDefaultName = ThirdPartyPojoBuilder.builder().build();
ThirdPartyPojo pojoWithCustomName = ThirdPartyPojoBuilder.builder().name("custom name").build();

System.out.println(pojoWithDefaultName.getName());
System.out.println(pojoWithCustomName.getName());

但是,这不起作用,因为 getName()pojoWithDefaultNamepojoWithCustomName 返回 null

最佳答案

基于 pirho's answer ,我找到了一个可行的解决方案,它也支持默认值。

  1. 扩展第三方类
  2. 在类级别添加@Builder注解
  3. 添加应由构建器配置的任何字段
  4. 添加 @Default 并为任何应具有默认值的字段赋值
  5. 添加一个所有参数匹配所有字段的构造函数
  6. 为每个构造函数参数添加this.set*(...)

例如


@Builder
public class ThirdPartyPojoBuilder extends ThirdPartyPojo {
    @Default
    private String name = "default name" 

    public ThirdPartyPojoBuilder(String name) {
        this.setName(name);
    }
}

它也支持默认值:

ThirdPartyPojo pojoWithDefaultName = ThirdPartyPojoBuilder.builder().build();
ThirdPartyPojo pojoWithCustomName = ThirdPartyPojoBuilder.builder().name("custom name").build();

System.out.println(pojoWithDefaultName.getName()); // prints "default name"
System.out.println(pojoWithCustomName.getName());  // prints "custom name"

关于java - 如何为第三方 POJO 创建构建器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70350039/

相关文章:

java - 在 Java 中的 Calendar API 之前我需要了解哪些重要的事情?

java - 添加 h :commandButton with f:param to h:dataTable 时出现 IllegalArgumentException

java - 使用 IPv4 的套接字通信

java - Android AsyncTask,警告 : "Unchecked generics array creation for varargs parameter"

DDB 中复合范围键的 Java 注释

java - 如何在方法上使用 Lombok @Builder 注释

spring - gradle 构建从终端失败以在 spring boot 应用程序中进行 lombok 注释

java - 参数值元素[...]与预期类型[org.hibernate.type.EnumType]不匹配

java - 如何在Java中创建一个简单的连接表?

java - Lombok 未创建默认构造函数导致 jackson-databinding 失败