122 votes

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

En raison de l'utilisation des génériques en Java, je me suis retrouvé à devoir implémenter une fonction ayant pour nom Void comme type de retour :

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

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

Je demande V oid, pas v oid. La classe Void , no le mot-clé réservé void .

J'ai aussi essayé Void.class , void , Void.TYPE , new Void() sans 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)

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

109voto

John Feminella Points 116878

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

Utilisez return null . Void ne peut pas être instancié et n'est qu'un simple substitut de l'objet 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, par exemple, vous utilisez la réflexion pour regarder une méthode avec un type de retour de void . (Techniquement, vous récupérerez Class<Void> .) Il a d'autres utilisations assorties de ces lignes, comme si vous vouliez paramétrer un fichier Callable<T> .

En raison de l'utilisation des génériques en Java, je me suis retrouvé à devoir implémenter cette fonction

Je dirais qu'il y a peut-être un problème avec votre API si vous devez 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 suspicieux, puisque cela n'est apparu que "grâce à l'utilisation de génériques".

15 votes

Devoir rendre le Vide n'est pas si funky après tout. Cela peut simplement être imposé 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.

0 votes

Le vide a des utilisations légitimes, comme je l'ai noté. Mais il a dit que "cela n'est apparu qu'en raison de l'utilisation de génériques". Cela donne l'impression qu'il a fait quelque chose à une collection qui a besoin d'utiliser Void, ce qui, à mon avis, est un cas plutôt exceptionnel.

0 votes

Avec des collections, ce serait très étrange, en effet.

28voto

Jon Bright Points 6834

Il n'y a aucun moyen d'instancier un Void, donc la seule chose que vous pouvez faire puede Le retour est nul.

15 votes

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

21voto

Bombe Points 34185

return null est la voie à suivre.

21voto

Martijn Points 3955

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

Void.class y Void.TYPE pointent vers le même objet et sont de type Class<Void> et non de Void .

C'est pourquoi vous ne pouvez pas renvoyer ces valeurs. new Void() serait de type Void mais ce constructeur n'existe pas. En effet, Void n'a pas de constructeurs publics et ne peut donc pas être instancié : Vous ne pouvez jamais avoir d'objet de type Void sauf pour le polymorphe null .

J'espère que cela vous aidera ! :-)

2 votes

Correction mineure : Void.TYPE ne pointe pas vers Void.class . Il indique void.class .

1voto

PhiLho Points 23458

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

0 votes

Je ne serai pas un MUST ; c'est juste une convention.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X