实现抽象的优雅方式 class
Elegant way to implement abstract class
我有一个抽象 class 只有一个抽象方法;和一些实施 classes(大约 6)。
方法returns 是一个对象,"needs" 有两个参数。
但是,在某些情况下,两个参数中只有一个是必需的。
有没有优雅的方法来实现这个案例? (而不是 return 此参数为空)
public class NormResult {
protected List<String> normWords;
protected List<String> unNormWords;
public NormResult(List<String> normWords,List<String> unNormWords) {
this.normWords = normWords;
this.unNormWords = unNormWords;
}
public NormResult(List<String> normWords) {
this.normWords = normWords;
this.unNormWords = Collections.emptyList();
}
}
public abstract class AbstractNormalizer {
protected abstract List<NormResult> doNorm();
}
public class FirstNormImpl extends AbstractNormalizer {
protected List<NormResult> doNorm() {
List<String> normWords = new ArrayList<>(5);
List<String> unNormWords = new ArrayList<>(7);
NormResult result = new NormResult(normWords, unNormWords);
return result;
}
}
public class SecondNormImpl extends AbstractNormalizer {
protected List<NormResult> doNorm() {
List<String> normWords = new ArrayList<>(8);
NormResult result = new NormResult(normWords);
return result;
}
}
如果您最终对会员这样做:
protected final List<String> normWords;
protected final List<String> unNormWords;
然后在构造函数中你必须初始化它们...然后你可以设置一个空集合或空引用你不have/need
你的重载构造函数看起来像:
public NormResult(List<String> normWords, List<String> unNormWords) {
this.normWords = normWords;
this.unNormWords = unNormWords;
}
public NormResult(List<String> normWords) {
this(normWords, Collections.emptyList());
}
我要做的两个改变:
- 将字段设置为 final
- 使用构造函数伸缩
如:
public NormResult(List<String> normWords) {
this(normWords(), Collections.emptyList());
}
避免即使是简单的 "code duplication" 两次赋值。
除此之外;我同意这些评论;这种方法看起来很合理。
我有一个抽象 class 只有一个抽象方法;和一些实施 classes(大约 6)。
方法returns 是一个对象,"needs" 有两个参数。
但是,在某些情况下,两个参数中只有一个是必需的。
有没有优雅的方法来实现这个案例? (而不是 return 此参数为空)
public class NormResult {
protected List<String> normWords;
protected List<String> unNormWords;
public NormResult(List<String> normWords,List<String> unNormWords) {
this.normWords = normWords;
this.unNormWords = unNormWords;
}
public NormResult(List<String> normWords) {
this.normWords = normWords;
this.unNormWords = Collections.emptyList();
}
}
public abstract class AbstractNormalizer {
protected abstract List<NormResult> doNorm();
}
public class FirstNormImpl extends AbstractNormalizer {
protected List<NormResult> doNorm() {
List<String> normWords = new ArrayList<>(5);
List<String> unNormWords = new ArrayList<>(7);
NormResult result = new NormResult(normWords, unNormWords);
return result;
}
}
public class SecondNormImpl extends AbstractNormalizer {
protected List<NormResult> doNorm() {
List<String> normWords = new ArrayList<>(8);
NormResult result = new NormResult(normWords);
return result;
}
}
如果您最终对会员这样做:
protected final List<String> normWords;
protected final List<String> unNormWords;
然后在构造函数中你必须初始化它们...然后你可以设置一个空集合或空引用你不have/need
你的重载构造函数看起来像:
public NormResult(List<String> normWords, List<String> unNormWords) {
this.normWords = normWords;
this.unNormWords = unNormWords;
}
public NormResult(List<String> normWords) {
this(normWords, Collections.emptyList());
}
我要做的两个改变:
- 将字段设置为 final
- 使用构造函数伸缩
如:
public NormResult(List<String> normWords) {
this(normWords(), Collections.emptyList());
}
避免即使是简单的 "code duplication" 两次赋值。
除此之外;我同意这些评论;这种方法看起来很合理。