Предоставление синхронных и асинхронных методов в составе API с использованием функции CompletableFuture

#java #completable-future

Вопрос:

У меня есть следующий статический экземпляр Java MyRegistry , который используется для вызова методов уровня обслуживания.

До сих пор он работал синхронно, предоставляя 2 метода.

 public final class MyRegistry {

  private static MyRegistry instance;

  public static MyRegistry getInstance() {
    if (instance == null) {
      instance = new MyRegistry();
    }
    return instance;
  }

  public <T> T invoke(MyService myService, String methodName) {
    return myService.invoke(methodName);
  }

  public <T> T invoke(MyService myService, String methodName, Object[] params) {
    return myService.invoke(methodName, params);
  }
}
 

Теперь требуется предоставить 2 новых асинхронных метода, использующих CompletableFuture экземпляры в качестве возвращаемых объектов.

Я смущен тем, как должны быть написаны эти 4 подписи метода.

Были предложены 4 подписи ниже, идея в том, что все методы, независимо от синхронизации/асинхронности, будут возвращать a CompletableFuture .

Однако не означает ли это, что это будет зависеть от потребителя API, выполняется ли операция синхронно или асинхронно на основе метода, который они вызывают для возвращаемого объекта?

то есть, используя либо .get() для блокировки, либо .thenAcceptAsync для асинхронного запуска на возвращенном CompletableFuture ?

Это означает, что в чем был бы смысл предоставления invoke invokeAsync альтернатив vs?

 public CompletableFuture invoke(MyService myService, String methodName, Object[] params) {

}

public CompletableFuture invoke(MyService myService, String methodName) {

}

public CompletableFuture invokeAsync(MyService myService, String methodName, Object[] params) {

}

public CompletableFuture invokeAsync(MyService myService, String methodName) {

}
 

Комментарии:

1. Future и CompletableFuture всегда означает, что вызов будет асинхронным, методы блокировки должны возвращать ожидаемый тип возврата T

2. Вызывающий абонент не решает, является ли операция асинхронной или нет. Когда вызывающий абонент связывает операцию по цепочке thenAcceptAsync , цепная операция будет асинхронной, но это не влияет на вашу операцию. Но действительно ли выглядит ваша старая декларация public <T> T invoke(MyService myService, String methodName) ? Это в основном обещает вернуть все, что пожелает вызывающий (метод даже не знает, что T это такое).