假设我有一个 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/