Il existe un type de référence Java Void
- V majuscule - . La seule situation que j'ai jamais vue utilisée est de paramétrer s Callable
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Existe-t-il d'autres utilisations du Void
type de référence Java ? Peut-on lui attribuer autre chose que null
? Si oui, avez-vous des exemples?
Réponses:
Void
est devenue une convention pour un argument générique qui ne vous intéresse pas. Il n'y a aucune raison pour que vous utilisiez un autre type non instanciable, tel queSystem
.Il est également souvent utilisé dans les
Map
valeurs d' exemple (bien que lesCollections.newSetFromMap
utilisations enBoolean
tant que mappes ne doivent pas accepter denull
valeurs) etjava.security.PrivilegedAction
.J'ai écrit une entrée blog sur
Void
quelques années en arrière.la source
java.lang.Void
. / Josh Bloch a popularisé la convention, mais une fois que vous l'avez vue, c'est le choix évident.Vous pouvez créer une instance de Void en utilisant des réflexions, mais elles ne sont utiles pour rien. Void est un moyen d'indiquer qu'une méthode générique ne renvoie rien.
imprime quelque chose comme
la source
System.exit(0)
). J'ai tendance à écrire des classes utilitaires avec un constructeur commeprivate Void() { throw new Error(); }
. Certains peuvent préférer une énumération sans valeur.Future<Void>
fonctionne comme du charme. :)la source
Future<?>
, car l'avenir aura souvent une valeur légitime (de non-Void
type) mais est utilisé dans un contexte qui ne se soucie pas de la valeur.CompletableFuture<Void>
fonctionne aussi comme un charme.Étant donné qu'il n'y a pas de constructeurs publics , je dirais que rien d'autre ne peut lui être attribué
null
. Je ne l'ai utilisé que 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 son Javadoc :
la source
Toutes les classes d'emballage primitives (
Integer
,Byte
,Boolean
,Double
, etc.) contiennent une référence à la classe primitive correspondante dans un statiqueTYPE
champ, par exemple:Void
a été initialement créé comme un endroit pour mettre une référence auvoid
type:Cependant, vous ne gagnez vraiment rien à utiliser
Void.TYPE
. Lorsque vous utilisez,void.class
il est beaucoup plus clair que vous faites quelque chose avec levoid
type.En passant, la dernière fois que je l'ai essayé, BeanShell ne l'a pas reconnu
void.class
, vous devez donc l'utiliserVoid.TYPE
.la source
Lorsque vous utilisez le modèle de visiteur, il peut être plus simple d'utiliser Void au lieu d'Object lorsque vous voulez être sûr que la valeur de retour sera nulle
Exemple
Lorsque vous implémenterez votre visiteur, vous pouvez définir explicitement OUT pour être Void afin que vous sachiez que votre visiteur retournera toujours null, au lieu d'utiliser Object
la source
Avant les génériques, il était créé pour l'API de réflexion, pour contenir TYPE renvoyé par Method.getReturnType () pour une méthode void, correspondant aux autres classes de type primitif.
EDIT: Du JavaDoc de Void: "La classe Void est une classe d'espace réservé non instable pour contenir une référence à l'objet Class représentant le mot clé Java void". Avant Generics, je suis conscient de toute utilité autre que la réflexion.
la source
Void
. Veuillez consulter stackoverflow.com/questions/34248693/...Comme vous ne pouvez pas instancier Void, vous pouvez utiliser l' objet Null Apache commons , donc
dans la première ligne, vous avez un objet, donc
aNullObject != null
détient, alors que dans la deuxième ligne il n'y a pas de référence, doncnoObjectHere == null
détientPour répondre à la question originale de l'affiche, il s'agit de faire la distinction entre «le rien» et «rien», qui sont des choses complètement différentes.
PS: Dites non au modèle d'objet nul
la source
Void est créé pour envelopper son type de vide primitif. Chaque type primitif a son type de référence correspondant. Void est utilisé pour instancier une classe générique ou utiliser une méthode générique, Un argument générique qui ne vous intéresse pas. Et voici un exemple ...
ici, comme vous pouvez le voir, je ne veux rien du serveur auquel je demande de créer de nouvelles inscriptions, mais
public interface AsyncCallback<T> { .... }
c'est une interface générique donc je fournis Void puisque les génériques n'acceptent pas les types primitifsla source
Il est également couramment utilisé sur les rappels d'achèvement Async-IO lorsque vous n'avez pas besoin d'un
Attachment
objet. Dans ce cas, vous spécifiez null à l'opération IO et implémentezCompletionHandler<Integer,Void>
.la source
C'est peut-être un cas rare mais une fois, je l'ai utilisé
Void
dans des classes d'aspect.C'était un aspect qui s'exécute après les méthodes qui ont une
@Log
annotation, et enregistre la méthode retournée et quelques informations si le type de retour de méthode n'est pas void.la source