2017-06-20 189 views
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; 
    } 
} 
+0

个人而言,我会用'null'替换'Collections.emptyList()',但除此之外,我没有看到任何问题。 – domsson

+1

你为什么要做**返回结果; **当你应该返回一个List? –

+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()); 
} 
+0

我想也许增加另一个抽象类,只有具有第二个参数的类才会实现它。 – userit1985

2

两个变化我会做:

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

为:

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

避免甚至是简单的“代码重复“分配值两次。

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

+0

[OT]:Ü-krass !!,Danke! –

+0

我想也许增加另一个抽象类,只有具有第二个参数的类才会实现它。 – userit1985

+0

这可能是一个选项。事情是:如果不知道所有的细节,这些决定很难做出。我们无法告诉您最适合您所有需求的最佳模型。我们只能提示;这就是我们所尝试的;-) – GhostCat