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语句的任务,请你建议我用其他方法来做,谢谢
你可以使用反射
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)
但是,在这种情况下它没有太大区别,除了抛出的异常将被包装,你可能需要打开它们才能看到原始的.
除非您要提供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.
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |