Les interfaces fonctionnelles Callable
et Supplier
dans les packages Java.util.concurrent
et Java.util.function
ont respectivement la signature suivante:
public interface Callable<V> {
V call() throws Exception;
}
public interface Supplier<T> {
T get();
}
Existe-t-il un cas d'utilisation spécifique où chacun d'entre eux est plus adapté que l'autre?
Leur différence d’utilisation peut être vue dans leur documentation respective:
Callable
:
Une tâche qui renvoie un résultat et peut générer une exception . Les développeurs Définissent une seule méthode sans arguments appelée call.
L’interface Callable est similaire à Runnable, en ce sens que les deux sont conçus pour les classes dont les instances sont potentiellement exécutées par Un autre thread .
Supplier
:
Représente un fournisseur de résultats.
Il n'est pas nécessaire qu'un résultat nouveau ou distinct soit renvoyé chaque Fois que le fournisseur est appelé.
Cela signifie que l'appelant de Callable.call
s'attend à la levée d'une exception et qu'il la gérera en conséquence. Ceci est utile pour des tâches telles que la lecture et l'écriture dans des fichiers, où de nombreux types de IOException
s peuvent être générés. Callable
est également conçu pour être exécuté sur un autre thread.
Supplier
est en revanche très général. C'est juste "fournit une valeur" et c'est tout.
Donc, Callable
est plus spécialisé que Supplier
. Si vous ne traitez pas avec un autre thread ou s'il est très peu probable que votre tâche lève une exception, Supplier
est recommandé.
Outre l'évident, Callable qui lance une exception, la différence est sémantique. Ils ont des noms différents parce qu'ils représentent des choses différentes. Le but est de rendre le code plus facile à comprendre. Lorsque vous utilisez un objet appelable, votre choix d'interface implique que l'objet soit exécuté par un autre thread. Lorsque vous utilisez le fournisseur, vous impliquez que c'est juste un objet qui fournit des données à un autre composant.