java - 如何在不显式使用构造函数的情况下生成不可变的 DTO?

标签 java immutability builder dto

假设我有一个 DTO 类:

public class SomeImmutableDto {

    private final String someField;
    private final String someOtherField;

    public SomeImmutableDto(String someField, String someOtherField) {
        // field setting here
    }

    // getters here
}

这是一个很好的不可变 DTO。但如果我有 20 个字段怎么办?它导致了大量不可读的构造函数和不可维护的代码的激增。

但是这个问题有一个解决方案,即构建器模式:

public class SomeImmutableDto {
    private final String someField;
    private final String someOtherField;

    private SomeImmutableDto(Builder builder) {
        // field setting here
    }

    public static class Builder {

        private String someField;
        private String someOtherField;

        // setters here

        public SomeImmutableDto build() {
          // building code here
        }
    }

    // getters here
}

现在我可以做这样的事情:

SomeImmutableDto dto = new SomeImmutableDto.Builder()
    .setSomeField(/* ... */)
    *setSomeOtherField(/* ... */)
    .build();

现在我有一个不可变的 dto,它没有大量丑陋的构造函数。

我的问题是,我需要一个具有公共(public) setter 不可变的 dto,因为项目中有一些遗留代码目前无法重构,并且需要存在公共(public) setter 才能初始化 dto 对象。

是否有一些模式可以在这里使用,或者这不起作用?我正在考虑代理模式,但我不确定它是否可以以一种看起来不像丑陋黑客的方式应用。

最佳答案

我认为如果您需要兼容遗留代码,最好的方法是使用不可修改的包装器,就像在 Collections.unmodifyingList 方法中所做的那样。

这是“黑客”,但我认为它是由遗留代码强制的,而且“还不错”:)

关于java - 如何在不显式使用构造函数的情况下生成不可变的 DTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16362775/

相关文章:

java - 一段时间后 OAuth "401: Invalid Credentials"

java - 如何对没有参数的静态void方法 stub ?

java - 如何访问实体列表中的另一列?

java - 如何使非原始类成员不可变

java - 构建器模式,但构建器位于对象构造函数中

Android 如何在点击后禁用正面按钮

java - 在 azure 上成功部署 restful api 但当我遇到 url 时总是返回 404 错误

javascript - Lodash:没有最后一个元素的数组,没有突变

java - 为什么 Bloch 声明不可能对集合实现进行子类化?

java - builder 模式会不会做得太多?