假设我有一个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对象。
是否有一些可在此处使用的模式或这不起作用?我正在考虑代理模式,但我不确定它是否可以以不像丑陋黑客的方式应用。
答案 0 :(得分:1)
我认为如果您需要符合遗留代码,最好的方法是使用不可修改的包装器,就像在Collections.unmodifiableList方法中一样。
这是“hack”,但我认为它是由遗留代码强制的,并且“不是那么糟糕”:)