Dans l'API
"La classe Void est une classe d'espace réservé non instanciable pour contenir une référence à l'objet Class représentant le mot-clé Java void."
Java.lang.Void
être utilisé? Si la classe est "non instable", à quoi sert-elle?Java.lang.Void
et void
?seul point de Void
doit contenir Void.TYPE
, qui est un peu comme void.class
. Si vous avez une référence réfléchie à une méthode qui renvoie void
et que vous obtenez son type de retour, elle renverra Void.TYPE
.
Vous ne pouvez pas et ne devez pas l'utiliser pour autre chose.
Java.lang.Void
est analogue à Java.lang.Integer
. Integer
est un moyen de mettre des valeurs de boxe de type primitif int
. Void
est un moyen de mettre des valeurs de boxe de type primitif void
.
"Mais attendez, void
n'a aucune valeur possible!"
Droite! C'est ce qui fait que Java.lang.Void
"non instable". :)
C'est une fonctionnalité intéressante du système de type Java que chaque type primitif a un équivalent encadré. int
a Integer
, long
a Long
, byte
a Byte
... et void
a Void
. Ce serait bizarre et asymétrique si Void
n'existait pas .
"Alors, quelle est la différence entre Java.lang.Void
et void
? "
Facile. void
est un type primitif. Void
est un type de référence qui hérite de Object
. Ils sont similaires dans la mesure où aucun d'eux n'a de valeur possible; mais néanmoins ce sont deux types très différents, du point de vue du système de types.
"Mais je n'ai aucune utilité pour Void
dans mes programmes."
Et je n'ai aucune utilité pour GarbageCollectorMXBean
dans le mien. Certaines fonctionnalités n'ont pas des utilisations non obscures. C'est bon.
L'utilisation la plus courante de Void
est pour la réflexion, mais ce n'est pas le seul endroit où elle peut être utilisée.
void
est un mot clé qui signifie qu'une fonction ne produit pas de valeur.
Java.lang.Void
est un type de référence, alors ce qui suit est valide:
Void nil = null;
(Pour l'instant ce n'est pas intéressant ...)
En tant que type de résultat (une fonction avec une valeur de retour de type Void
), cela signifie que la fonction * toujours * retourne null
(elle ne peut pas renvoyer autre chose que null
, car Void
n'a pas d'instances).
Void function(int a, int b) {
//do something
return null;
}
Pourquoi voudrais-je une fonction qui toujours renvoie null?
Avant l'invention des génériques, je n'avais pas de cas d'utilisation pour Void
.
Avec les génériques, il y a des cas intéressants. Par exemple, un Future<T>
est un support pour le résultat d'une opération asynchrone effectuée par un autre thread. Future.get
renverra la valeur de l'opération (de type T
) et se bloquera jusqu'à ce que le calcul soit effectué.
Mais ... Et s'il n'y a rien à retourner? Simple: utilisez un Future<Void>
. Par exemple, dans Google App Engine, le service Asyncronous Datastore delete
renvoie un future. When
avoir()is invoked on that future,
null` est retourné après la suppression est terminée. On pourrait écrire un exemple similaire avec Callable s.
Un autre cas d'utilisation est un Map
sans valeurs, c'est-à-dire un Map<T,Void>
. Une telle carte se comporte comme un Set<T>
, alors cela peut être utile quand il n'y a pas d'implémentation équivalente de Set
(par exemple, il n'y a pas de WeakHashSet
, alors on pourrait utiliser un WeakHashMap<T,Void>
).
Void est une fonction AutoBoxing (depuis JDK 1.5) de void.
bien son explication que Void est une référence tandis que void est un type primitif.
Alors, où l'exigence vient d'avoir à utiliser Void ???
Une utilisation courante avec les types génériques où nous ne pouvons pas utiliser de primitive.
Disons, en cas de Android
AsyncTaks<Params, Progress, Result>
que faire si je ne veux pas recevoir la mise à jour de Progress. Je ne peux pas utiliser void (type primitif) ici, nous avons besoin de Java.lang.Void
Un autre exemple d'utilisation de Void
est SwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();
Void est utile car parfois vous devez spécifier le type de retour d'une méthode en dehors de la méthode elle-même.
Par exemple, prenez ceci expression lambda Java 8 , qui vérifie si un objet EventResource a certaines propriétés, en utilisant une méthode appelée checkBenefitConcertInCentralPark
, passée dans la méthode checkCreatedEvent
:
eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);
La méthode checkBenefitConcertInCentralPark
est définie comme ceci (notez l'utilisation de Void):
public static Void checkBenefitConcertInCentralPark(EventResource eventResource) {
// JUnit code here...
// assertThat(blablabla :) )
return null; // we can only return null at the end of a method when returning Void
}
puis la méthode checkBenefitConcertInCentralPark
est passée dans la méthode checkCreatedEvent
.
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}