这里我实现了以下两个功能,如下所示:
Output1 computeFirst(Input1 input) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
#critical section
}catch(Exception e){
log.error(e);
}finally{
releaseLock(lockItem);
}
}
Output2 computeSecond(Input2 input) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
#critical section
}catch(Exception e){
log.error(e);
}finally{
releaseLock(lockItem);
}
}
以上两个函数在不同的流程中被调用。
从上面两个函数中,我想通过编写一个如下所示的函数来抽象出 acquireLock 和 releaseLock 功能:
executeWithLock(String lockName, funcionReference) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
func.apply
} catch(Exception e){
log.error(e);
} finally {
releaseLock(lockItem);
}
}
我无法弄清楚如何实现这个executeWithLock函数,在这种情况下,我已经浏览了stackoverflow中关于如何将函数作为参数传递的相关帖子,但不太理解。
最佳答案
Runnable 无法工作,因为也有输出。
public interface Identifiable{
String getId();
}
public static <T extends Identifiable,R> R executeWithLock(T input, Function<T,R> func) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
return func.apply(input);
} catch(Exception e){
log.error(e);
return null;
} finally {
releaseLock(lockItem);
}
}
调用类似
Output1 output = executeWithLock(input1,
(input) -> {return /*compute output as in critical section*/ null;});
关于java - 使用函数接口(interface)抽象公共(public)代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51157631/