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?
Daniel Rikowski
la source

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".

John Feminella
la source
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.

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

return null est la voie à suivre.

Bombe
la source
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! :-)

Martijn
la source
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.

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

juste comme ça.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Jang-Ho Bae
la source
2
Le PO a dit Voidnon void. Les autres réponses semblent déjà couvrir assez bien le sujet.
E_net4 reste à l'écart du Meta du