web-dev-qa-db-fra.com

Callable vs interface fournisseur en java

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?

5
arunkjn

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 IOExceptions 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é.

5
Sweeper

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.

0
Torben