Comment créer un formulaire de futur en java
Quelle est la meilleure façon de construire un formulaire de futur en Java? J'ai mis en œuvre mes propres CompletedFuture
ci-dessous, mais espérais quelque chose comme ce qui existe déjà.
public class CompletedFuture<T> implements Future<T> {
private final T result;
public CompletedFuture(final T result) {
this.result = result;
}
@Override
public boolean cancel(final boolean b) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
return this.result;
}
@Override
public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
return get();
}
}
- La meilleure façon de ne pas en créer un! 😉 Pourquoi avez-vous besoin pour mettre en œuvre un Avenir? Ne pouvez-vous pas utiliser les objets de retour d'un avenir à la place?
- Je soupçonne n'en existe aucun, parce que je n'ai jamais vu une raison d'en avoir un. Peut-être que vous pourriez nous expliquer ce que vous essayez de faire?
- Je suppose qu'il en a besoin pour certaines API que pour certains tordus raison veut travailler avec des contrats à terme, même si il a vraiment que les besoins de ses valeurs. Ou il en a besoin pour se moquant. Au moins, c'est les seules raisons que je peux imaginer.
- Les tests unitaires serait une très bonne raison de vouloir -- un moqué de service de retour d'un avenir avec des valeurs de test.
- Que diriez-vous si vous aviez une méthode qui accepte un Callable<T>, et qui peut ou ne peut pas exécuter le travail de manière asynchrone tributaire de la disponibilité des ressources ou à d'autres facteurs, tels que les options qui a déjà été fourni de façon plus tôt? Imaginez si Exécuteur testamentaire.execute(Runnable) a pris un Callable<T> comme paramètre à la place et a décidé de l'exécuter dans le thread qui s'exécute, ne serait pas la mise en œuvre devez créer son propre Avenir<T> alors?
- J'ai le même besoin et peut expliquer... Le code que j'ai écris attend une liste de contrats à Terme représentant les résultats des requêtes qui sont tous évidemment exécutées simultanément. Cependant, dans chaque cas, le résultat de la requête peut être mis en cache, et quand il l'est, mon code renvoie une CompletedFuture du résultat mis en cache. Cela donne un propre de l'abstraction et de la séparation des préoccupations.
Vous devez vous connecter pour publier un commentaire.
Apache Commons Lang définit similaire de mise en œuvre qui est appelé ConstantFuture, vous pouvez l'obtenir en appelant le:
Dans Java 8, vous pouvez utiliser le haut-CompletableFuture:
Goyave définit
à Terme.immediateFuture(valeur)
, qui fait le travail.imprimera "foo";
Vous pouvez également avoir un Avenir, qui lève une exception lorsque get() est appelée:
J'ai trouvé un très similaire à la vôtre, en Java rt.jar
com.soleil.xml.interne.ws.util.CompletedFuture
Il vous permet aussi de spécifier une exception peut être levée lorsque get() est invoquée. Définissez simplement que la valeur null si vous ne voulez pas de jeter une exception.
com.sun.*
paquet n'est pas une bonne idée. Ces classes sont généralement considérés comme une mise en œuvre interne de détail, et sont susceptibles de changer dans les versions de Java.Dans la version 6 de Java, vous pouvez utiliser les éléments suivants: