使用函数接口抽象公共代码的问题

2023-12-07

在这里我实现了以下两个功能,如下所示:

  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;});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用函数接口抽象公共代码的问题 的相关文章

随机推荐