2

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

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

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

4

1 回答 1

2

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

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

于 2013-05-03T15:43:32.850 回答