所以我想重用一些功能,比如try catch
和我的应用程序使用的一些其他常用功能。我想知道这种方法是否合适。或者,如果有任何其他方法会很棒。我想了解如何实现这一点的不同方法。
这是服务将使用的回调函数。
public interface ClientOperation <T>{
T doAction(SomeObject someObject);
}
这是将执行ClientOperation
public interface Executor {
<T> T doTask(ClientOperation<T> operation);
}
Executor
public class ExecutorImpl implements Executor {
public <T> T doTask(ClientOperation<T> operation) {
T response = null;
/*
DO SOMETHING FIRST - USED BY ALL CLASSES
*/
try {
response = operation.doAction(someObject);
} catch (SomeException e) {
/*
DO SOME SERIOUS STUFF
*/
} catch (Exception e) {
LOGGER.error(e.getMessage());
throw new SystemException(e.getMessage(), e);
}
return response;
}
}
执行某项操作并实现回调函数的服务
public void addSomething(final Secret secret)
throws UnauthorizedActionException, InvalidSecretKeyException {
executorService.doTask(new ClientOperation<Response>() {
public Response doAction(SomeObject someObject) {
//DO STUFF ON THIS
return template.write(secret.getPath(),
secret.getSecretValue());
}
});
}
答案 0 :(得分:1)
我想了解如何实现这一点的不同方法。
你的方法似乎很好。我会更进一步,并使输入(即SomeObject
)通用,以便ClientOperation
可以使用不同的输入类型。
public interface ClientOperation <T,S>{
T doAction(S someObject);
}
另一种方法是使用Template Method模式,其中ClientOperation
转换为abstract
类,并使用abstract
doAction
方法和具体{在final
块中调用doTask
的{1}} doAction
方法。子类提供try-catch
方法的实现。这种方法的一个缺点是你不能从任何其他类扩展。