172 votes

Utilisations du type de référence Void en Java ?

Il existe un Java Void -- majuscule V-- type de référence. La seule situation où je l'ai jamais vu utilisé est pour paramétrer des Callable

final Callable callable = new Callable() {
            public Void call() {
                foobar();
                return null;
            }
        };

Y a-t-il d'autres utilisations pour le type de référence Java Void? Peut-on lui assigner autre chose que null? Si oui, auriez-vous des exemples?

0 votes

0 votes

En Java8, il existe de nouvelles fonctions : utiliser l'interface Function pour remplacer Consumer ou Supplier

0 votes

Ce code est souvent aussi utilisé avec SwingWorker pour indiquer que l'un ou les deux de ses paramètres de type (type de résultat et type intermédiaire) ne sont pas utilisés

125voto

Tom Hawtin - tackline Points 82671

Void est devenu une convention pour un argument générique qui ne vous intéresse pas. Il n'y a aucune raison pour laquelle vous devriez utiliser un autre type non instanciable, tel que System.

Il est également souvent utilisé par exemple dans les valeurs de Map (bien que Collections.newSetFromMap utilise Boolean car les cartes n'ont pas besoin d'accepter les valeurs null) et java.security.PrivilegedAction.

0 votes

Qui a créé cette convention? les documents indiquent docs.oracle.com/javase/tutorial/java/generics/types.html "Conventions de nommage des paramètres de type Selon la convention, les noms des paramètres de type sont des lettres majuscules uniques."

4 votes

@barlop C'est l'argument et non le nom du paramètre. Autrement dit, c'est le type java.lang.Void. / Josh Bloch a popularisé cette convention, même si une fois que vous l'avez vue, c'est le choix évident.

6 votes

Cette entrée de blog est morte

56voto

Peter Lawrey Points 229686

Vous pouvez créer une instance de Void en utilisant les réflexions, mais elles ne sont pas utiles pour quoi que ce soit. Void est une façon d'indiquer qu'une méthode générique ne retourne rien.

Constructor constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("J'ai un " + v);

imprime quelque chose comme

J'ai un java.lang.Void@75636731

26 votes

+1 pour instancier une classe que la documentation dit être non instanciable. J'ai fait cela aussi et je suis d'accord pour dire que les Voids instantiés sont inutiles.

1 votes

Constructeur cv = Void.class.getDeclaredConstructor(); cv.setAccessible(true); Vide v = cv.newInstance(); System.out.println(v); // ;)

0 votes

En tant qu'exercice, essayez de créer une nouvelle classe en utilisant des réflexions et voyez ce qu'il se passe.

28voto

Alexander Temerev Points 1319

Future fonctionne comme un charme. :)

6 votes

Il est plus courant (par exemple, dans Guava) d'utiliser Future, car le future aura souvent une valeur légitime (d'un type non-Void) mais il est utilisé dans un contexte qui ne se soucie pas de la valeur.

1 votes

CompletableFuture fonctionne également à merveille.

20voto

Michael Myers Points 82361

Étant donné qu'il n'y a aucun constructeur public, je dirais qu'il ne peut être affecté à rien d'autre que null. Je l'ai seulement utilisé comme espace réservé pour "Je n'ai pas besoin d'utiliser ce paramètre générique," comme le montre votre exemple.

Il pourrait également être utilisé en réflexion, d'après ce que dit sa Javadoc:

La classe Void est une classe espace réservé non instanciable pour détenir une référence à l'objet Class représentant le mot-clé Java void.

0 votes

Drôle de voir Oracle/Sun le décrire ainsi car null est une instance de tous les types. Quoi qu'il en soit, comme vous l'avez dit, la signification pure de cela est "je pourrais écrire n'importe quel type ici car je ne m'y intéresse pas, alors je vais mettre Void pour m'assurer que les personnes qui lisent mon code comprennent exactement cela"

20voto

Luke Woodward Points 20417

Toutes les classes d'enveloppe primitives (Integer, Byte, Boolean, Double, etc.) contiennent une référence à la classe primitive correspondante dans un champ statique TYPE, par exemple:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Void a été initialement créé comme un endroit où stocker une référence au type void:

Void.TYPE == void.class

Cependant, vous ne gagnez pas vraiment grand-chose en utilisant Void.TYPE. Quand vous utilisez void.class il est beaucoup plus clair que vous travaillez avec le type void.

En guise de digression, la dernière fois que j'ai essayé, BeanShell ne reconnaissait pas void.class, donc vous devez utiliser Void.TYPE là-bas.

8 votes

Donc il y a à la fois un Void.class et un void.class!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X