实现抽象的优雅方式 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" 两次赋值。

除此之外;我同意这些评论;这种方法看起来很合理。