Проблема абстрагирования общего кода с использованием интерфейса функций - PullRequest
0 голосов
/ 03 июля 2018

здесь я реализовал две следующие функции, как показано ниже:

  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);
        }
    }

Эти две вышеуказанные функции вызываются в другом потоке.

Из вышеупомянутых двух функций я хочу абстрагировать функциональность acquLock и 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, касающиеся того, как передать функцию в качестве аргумента, но не смог понять многое.

1 Ответ

0 голосов
/ 03 июля 2018

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;});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...