如何在不明确使用构造函数的情况下生成不可变的DTO?

时间:2013-05-03 15:42:52

标签: 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个字段怎么办?它导致许多不可读的构造函数和不可维护的代码的扩散。

这个问题有一个解决方案,但是Builder模式:

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,它没有大量丑陋的构造函数。

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

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

1 个答案:

答案 0 :(得分:1)

我认为如果您需要符合遗留代码,最好的方法是使用不可修改的包装器,就像在Collections.unmodifiableList方法中一样。

这是“hack”,但我认为它是由遗留代码强制的,并且“不是那么糟糕”:)