Que dois-je retourner si le type de retour d'une méthode est Void? (Pas nul!)


115

En raison de l'utilisation de Generics en Java, j'ai fini par devoir implémenter une fonction ayant Voidcomme type de retour:

public Void doSomething() {
    //...
}

et le compilateur demande que je retourne quelque chose . Pour l'instant, je reviens juste null, mais je me demande si c'est une bonne pratique de codage ...

Je pose des questions sur V ‌oid, pas sur v ‌oid. La classe Void, pas le mot-clé réservé void.

J'ai aussi essayé Void.class, void, Void.TYPE, new Void(), pas de retour du tout, mais tout ce qui ne fonctionne pas du tout. (Pour des raisons plus ou moins évidentes) (Voir cette réponse pour plus de détails)

  • Alors, que suis-je censé retourner si le type de retour d'une fonction est Void?
  • Quelle est l'utilisation générale de la Voidclasse?

Réponses:


104

Alors, que suis-je censé retourner si le type de retour d'une fonction doit être Void?

Utilisez return null. Voidne peut pas être instancié et est simplement un espace réservé pour le Class<T>type de void.

À quoi ça sert Void?

Comme indiqué ci-dessus, c'est un espace réservé. Voidest ce que vous obtiendrez si, par exemple, vous utilisez la réflexion pour examiner une méthode avec un type de retour void. (Techniquement, vous reviendrez Class<Void>.) Il a d'autres utilisations variées dans ce sens, comme si vous souhaitez paramétrer un fichier Callable<T>.

En raison de l'utilisation de génériques en Java, j'ai fini par devoir implémenter cette fonction

Je dirais que quelque chose peut être génial avec votre API si vous deviez implémenter une méthode avec cette signature. Examinez attentivement s'il existe une meilleure façon de faire ce que vous voulez (peut-être pouvez-vous fournir plus de détails dans une autre question de suivi?). Je suis un peu méfiant, car cela ne s'est produit que "à cause de l'utilisation de génériques".


13
Devoir rendre Void n'est pas si funky après tout. Il peut simplement être mandaté par exemple par Callable <T>. Parfois, vous n'avez tout simplement pas besoin de retourner quelque chose, mais vous ne pouvez pas utiliser par exemple Runnable.
Bombe

Void a des utilisations légitimes, comme je l'ai noté. Mais il a dit que "cela ne s'est produit que grâce à l'utilisation de génériques". Cela donne l'impression qu'il a fait quelque chose à une collection qui doit utiliser Void, ce qui, je dirais, est un cas plutôt exceptionnel.
John Feminella

Avec les collections, ce serait vraiment très étrange.
Bombe

Void.class et void.class sont tous deux de classe <Void> mais ils ne sont pas égaux. Void est souvent utilisé comme argument générique dans la valeur de Map (ou utilise le Collections.newSetFromMap) et le retour d'AccessController.doPrivileged.
Tom Hawtin - tackline

@Tom: Yeppers. C'est pourquoi j'ai marqué le "(Techniquement, vous récupérerez la classe <Void>.)" Dois-je modifier cette partie ou pensez-vous qu'elle est exacte telle quelle?
John Feminella

26

Il n'y a aucun moyen d'instancier un Void, donc la seule chose que vous pouvez retourner est null.


13
Plus précisément, il n'y a aucun moyen d'instancier un Vide sans faire de mauvaises choses.
Michael Myers


20

Pour expliquer pourquoi les autres suggestions que vous avez faites ne fonctionnent pas:

Void.classet Void.TYPEpointent vers le même objet et sont de type Class<Void>, pas de Void.

C'est pourquoi vous ne pouvez pas renvoyer ces valeurs. new Void()serait de type Voidmais ce constructeur n'existe pas. En fait, Voidn'a pas de constructeur public et ne peut donc pas être instancié: vous ne pouvez jamais avoir d'objet de type à l' Voidexception du polymorphe null.

J'espère que cela t'aides! :-)


1
Correction mineure: Void.TYPEne pointe pas vers Void.class. Il pointe vers void.class.
shmosel

1

Si, pour des raisons obscures, vous DEVEZ utiliser ce type, alors le retour de null semble être une option raisonnable, car je suppose que la valeur de retour ne sera pas utilisée de toute façon.
Le compilateur vous obligera quand même à retourner quelque chose.
Et cette classe ne semble pas avoir de constructeur public, donc le nouveau Void () n'est pas possible.


Je ne serai pas un must; c'est juste une convention.
Tom Hawtin - tackline

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.