2

我有一个带有单个抽象方法的抽象类;和一些实现类(大约 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;
    }
}
4

2 回答 2

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());
}
于 2017-06-20T11:34:08.430 回答
2

我要做的两个改变:

  • 使字段最终
  • 使用构造函数伸缩

如:

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

甚至避免两次赋值的简单“代码重复”。

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

于 2017-06-20T11:37:21.543 回答