实现抽象类

时间:2017-06-20 11:28:18

标签: java abstract implements coding-efficiency

我有一个抽象类,只有一个抽象方法;和一些实施类(约6)。

该方法返回一个“需要”两个参数的对象。

但是,在某些情况下,只需要两个参数中的一个。

有没有一种优雅的方式来实现这种情况? (而不是将此参数返回为空)

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;
    }
}

2 个答案:

答案 0 :(得分:2)

如果你对成员决赛这样做:

 protected final List<String> normWords;
 protected final List<String> unNormWords;

然后在构造函数中你必须初始化它们...然后你可以设置为空集合或空引用你没有/需要的那个

并且重载的构造函数可能如下所示:

public NormResult(List<String> normWords, List<String> unNormWords) {
    this.normWords = normWords;
    this.unNormWords = unNormWords;
}

public NormResult(List<String> normWords) {
    this(normWords, Collections.emptyList());
}

答案 1 :(得分:2)

我要做的两个改变:

  • 使字段最终
  • 使用构造函数telescoping

如:

public NormResult(List<String> normWords) {
  this(normWords(), Collections.emptyList()); 
}

以避免两次分配值的简单“代码重复”。

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