J'utilise des contrats à terme complétables dans Java 8 et je veux écrire une méthode qui, en fonction d'un paramètre reçu, exécute plusieurs tâches avec des effets secondaires en parallèle, puis retourne leur avenir "combiné" ( en utilisant CompletableFuture.allOf()
), ou ne fait rien et retourne un futur déjà terminé.
Cependant, allOf
renvoie un CompletableFuture<Void>
:
public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)
Et la seule façon de créer un futur déjà terminé qui sait est d'utiliser completedFuture()
, qui attend une valeur:
public static <U> CompletableFuture<U> completedFuture(U value)
Renvoie un nouveau CompletableFuture déjà complété avec la valeur donnée.
et Void
n'est pas instable, j'ai donc besoin d'un autre moyen pour créer un futur déjà terminé de type CompletableFuture<Void>
.
Quelle est la meilleure façon de procéder?
Puisque Void
ne peut pas être instancié, vous ne pouvez compléter un CompletableFuture<Void>
Qu'avec un résultat null
, ce qui est exactement ce que vous obtiendrez également lors de l'appel de join()
sur le futur retourné par allOf()
une fois qu'il a été complété avec succès.
Vous pouvez donc utiliser
CompletableFuture<Void> cf = CompletableFuture.completedFuture(null);
pour obtenir un tel avenir déjà achevé.
Mais vous pouvez également utiliser
CompletableFuture<Void> cf = CompletableFuture.allOf();
pour indiquer qu'il n'y a pas d'emplois dont le résultat dépend. Le résultat sera exactement le même.
passer un null
je suppose:
CompletableFuture<Void> done = CompletableFuture.completedFuture(null);