替换if else语句

Tan*_*ano 2 java algorithm design-patterns

我有一个看起来像这样的代码:

if(num == 1) {
return new Alg1();
} else if (num == 2) {
return new Alg2();
}
...
else if (num == n) {
return new AlgN();
}
Run Code Online (Sandbox Code Playgroud)

我试图使用策略模式,但似乎它不能满足减少if语句的任务,请你建议我用其他方法来做,谢谢

Pet*_*rey 6

你可以使用反射

try {
    return Class.forName("mypackage.Alg" + num).newInstance();
} catch (Exception e) { 
    // handle exception
}
Run Code Online (Sandbox Code Playgroud)

您可以选择使用RuntimeException进行换行,或者如果它是您期望的那样,则不进行换行

public static Algorythm loadAlgo(int n) throws IOException {
    try {
        return Class.forName("mypackage.Alg" + num).newInstance();

    } catch (Exception e) { 
        if (e instanceof IOException) 
            throw (IOException) e;
        throw new IOException("Unable to load Algo", e);
    }
Run Code Online (Sandbox Code Playgroud)

您必须使用此newInstance()方法捕获所有异常,而不仅仅是已检查的异常,因为它不会包含构造函数中抛出的异常.你可以使用更长的时间

try {
    return Class.forName("mypackage.Alg" + num).getConstructor().newInstance();
} catch (Exception e) { 
    // handle exception
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下它没有太大区别,除了抛出的异常将被包装,你可能需要打开它们才能看到原始的.


And*_*ner 6

除非您要提供40亿个Alg*课程,否则请使用enum而不是int:

enum Strategy {
  ALG_1 { @Override public Alg1 newInstance() { return new Alg1(); },
  ALG_2 { @Override public Alg2 newInstance() { return new Alg2(); },
  // ...
  ;

  public abstract AlgBase newInstance();
}
Run Code Online (Sandbox Code Playgroud)

然后就不需要任何条件:

return strategy.newInstance();
Run Code Online (Sandbox Code Playgroud)

哪个strategy是实例Strategy.