web-dev-qa-db-fra.com

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

En raison de l'utilisation de génériques dans Java j'ai fini par devoir implémenter une fonction ayant Void comme type de retour:

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

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

Je pose des questions sur [~ # ~] v [~ # ~] ‌oid, pas v ‌oid. La classe Void, pas le mot clé réservé void.

J'ai également essayé Void.class, void, Void.TYPE, new Void(), pas de retour du tout, mais tout cela 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'utilité générale de la classe Void?
112
Daniel Rikowski

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

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

Quel est l'intérêt de Void?

Comme indiqué ci-dessus, il s'agit d'un espace réservé. Void est ce que vous obtiendrez si vous, par exemple, utilisez la réflexion pour regarder une méthode avec un type de retour de void. (Techniquement, vous reviendrez Class<Void>.) Il a d'autres utilisations assorties le long de ces lignes, comme si vous voulez paramétrer un Callable<T>.

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

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

103
John Feminella

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

25
Jon Bright

return null est la voie à suivre.

20
Bombe

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

Void.class Et Void.TYPE Pointent vers le même objet et sont de type Class<Void>, Pas de Void.

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

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

20
Martijn

Si, pour des raisons obscures, vous DEVEZ utiliser ce type, le retour de null semble en effet ê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 de toute façon à renvoyer quelque chose.
Et cette classe ne semble pas avoir de constructeur public, donc le nouveau Void () n'est pas possible.

0
PhiLho