java - exceptionally - spring async call




¿Devuelve CompletableFuture<Void> o CompletableFuture<?>? (3)

¿Sería mejor devolver CompletableFuture <Void> o CompletableFuture <?>

¿Hay alguna razón para preferir uno u otro, o son intercambiables?

Hay tres contextos que el código puede afectar:

  • Tiempo de ejecución: los genéricos no tienen ninguna implicación.
  • Compilar: no puedo imaginar un caso en el que algún método acepte Future<Void> pero no acepte Future<?> .
  • Desarrollo: si el resultado de Future no tiene ningún significado, es una buena práctica decirlo a los usuarios a través de la declaración.

Entonces Future<Void> es más preferible.

Quiero escribir un método asíncrono que devuelva un CompletableFuture . El único propósito del futuro es rastrear cuándo se completa el método, no su resultado. ¿Sería mejor devolver CompletableFuture<Void> o CompletableFuture<?> ? ¿Hay alguna razón para preferir uno u otro, o son intercambiables?

Tenga en cuenta que solo pregunto sobre los tipos de retorno, no las listas de parámetros, las declaraciones de variables u otros contextos.


Al CompletableFuture API CompletableFuture , encontrará que CompletableFuture<Void> se utiliza con los métodos de efectos secundarios en los que no se puede obtener el resultado (porque no existe), por ejemplo:

CompletableFuture.runAsync(Runnable runnable);

devolver un CompletableFuture<Object> aquí sería confuso porque realmente no hay resultados, solo nos importa la finalización. Métodos que llevan a Consumers y Runnables devolver CompletableFuture<Void> , por ejemplo: thenAccept , thenAcceptAsync . Consumer y Runnable se usan para efectos secundarios en general.

Otro caso de uso para Void es cuando realmente no conoces el resultado. Por ejemplo: CompletableFuture.allOf , la lista aprobada puede ser un CompletableFuture originado a partir de Runnable, por lo que no podemos obtener el resultado.

Habiendo dicho todo eso, CompletableFuture<Void> solo es bueno si no tiene otra opción, si puede devolver el resultado, por favor vaya, la persona que llama puede optar por descartarlo si no está interesado. Dijiste que solo te interesaba completarlo, entonces sí, CompletableFuture<Void> haría el trabajo, pero los usuarios de API te odiarían si supieran que CompletableFuture<T> era una opción y tú simplemente decidiste en su nombre que Nunca necesitarás el resultado.


Es mejor usar CompletableFuture<Void> .

Según esta respuesta encontrada por Sotirios Delimanolis , Future<?> Es un defecto menor de API. En Java 6, el método submit() usaba un Future<Object> , por lo que su tipo de retorno se configuró como Future<?> . En Java 7, la implementación cambió para usar Future<Void> internamente, pero ya era demasiado tarde para cambiar la API, por lo que el valor de retorno se mantuvo como Future<?> .

Las API de Java más nuevas utilizan Future<Void> y CompletableFuture<Void> . Esos son los ejemplos que debemos seguir.





completable-future