调用作为参数传入的方法的非静态通用函数
Non-Static Generic function that invokes a method passed in as a parameter
我正在尝试将 2 个方法合并为 1 个,因为它们处理异常的方式相同。我知道在 C# 中你可以将 functions/actions 作为参数传递给其他函数。我尝试创建一个通用方法来调用一个函数,但似乎无法弄清楚。
public String getTheStuff(String client) {
try {
return extService.getProduct(client);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
public CustomType getsomeMoreStuff(String source, int offset) {
try {
return extService.getMetrics(source, offset);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
我要找的是
public T invokeExtService(Function functionToInvoke, Parameters[] params){
try {
return functionToInvoke.Invoke(params);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
正如@LouisWasserman 所说,这在 Java 8 中会好得多,但是这样的东西怎么样(未经测试):
public <T> T invoke(Callable<T> function) {
try {
return function.call();
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
public String getTheStuff(final String client) {
return invoke(new Callable<String>() {
@Override
public String call() {
return extService.getProduct(client);
}
});
}
public CustomType getsomeMoreStuff(final String source, final int offset) {
return invoke(new Callable<CustomType>() {
@Override
public CustomType call() {
return extService.getMetrics(source, offset);
}
});
}
老实说,考虑到您的方法有多短(使用 multi-catch 它们可能会更短),我不确定这样做是否值得。
我正在尝试将 2 个方法合并为 1 个,因为它们处理异常的方式相同。我知道在 C# 中你可以将 functions/actions 作为参数传递给其他函数。我尝试创建一个通用方法来调用一个函数,但似乎无法弄清楚。
public String getTheStuff(String client) {
try {
return extService.getProduct(client);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
public CustomType getsomeMoreStuff(String source, int offset) {
try {
return extService.getMetrics(source, offset);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
我要找的是
public T invokeExtService(Function functionToInvoke, Parameters[] params){
try {
return functionToInvoke.Invoke(params);
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
正如@LouisWasserman 所说,这在 Java 8 中会好得多,但是这样的东西怎么样(未经测试):
public <T> T invoke(Callable<T> function) {
try {
return function.call();
} catch (UIException e) {
notHealthy();
} catch (HostException e) {
notHealthy();
} catch (Exception e) {
Throwables.propagate(e);
}
}
public String getTheStuff(final String client) {
return invoke(new Callable<String>() {
@Override
public String call() {
return extService.getProduct(client);
}
});
}
public CustomType getsomeMoreStuff(final String source, final int offset) {
return invoke(new Callable<CustomType>() {
@Override
public CustomType call() {
return extService.getMetrics(source, offset);
}
});
}
老实说,考虑到您的方法有多短(使用 multi-catch 它们可能会更短),我不确定这样做是否值得。