#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
это такое).