Lom*_*mbo 4 java constructor final
让我们假设我有以下类试图成为不可变的
public class Computation {
private final Operation operation;
private final double epsilon;
public Computation(Operation operation) {
this.operation = operation;
//Default value
epsilon = 0.01;
}
public Computation(Operation operation double epsilon) {
this(operation);
//Won't compile as epsilon is final and is set by the other constructor
this.epsilon = epsilon;
}
}
Run Code Online (Sandbox Code Playgroud)
而且,为了这个问题,让我们假设我不想在这个类中使用构建器(这将解决问题).
所以问题是:
有没有办法实现这种行为,而无需将最终修饰符移除到epsilon并保留两个构造函数?
也就是说,没有做类似的事情
public class Computation {
private final Operation operation;
private final double epsilon;
public Computation(Operation operation Double epsilon) {
this(operation);
this.epsilon = (epsilon == null) ? 0.01 : epsilon;
}
}
Run Code Online (Sandbox Code Playgroud)
而不使用建设者
public class Computation {
private final Operation operation;
private final double epsilon;
private Computation(Builder builder) {
this.operation = builder.operation;
this.epsilon = builder.epsilon;
}
public static class Builder {
private final Operation operation;
//Default value
private double epsilon = 0.01;
public Builder(Operation operation) {
this.operation = operation;
}
public Builder epsilon(double epsilon) {
this.epsilon = epsilon;
return this;
}
public Computation build() {
return new Computation(this);
}
}
Run Code Online (Sandbox Code Playgroud)
是 - 反转逻辑,以便具有较少参数的构造函数调用具有更多参数的构造函数:
public Computation(Operation operation) {
this(operation, 0.01);
}
public Computation(Operation operation, double epsilon) {
this.operation = operation;
this.epsilon = epsilon;
}
Run Code Online (Sandbox Code Playgroud)
基本上这样你就可以得到很多构造函数,这些构造函数都只是委托给一个完成所有实际工作的"真正"构造函数.
归档时间: |
|
查看次数: |
1030 次 |
最近记录: |