¿Qué devuelvo si el tipo de devolución de un método es Void? (¡No vacío!)


115

Debido al uso de genéricos en Java terminé teniendo que implementar una función que tenía Voidcomo tipo de retorno:

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

y el compilador exige que devuelva algo . Por ahora, acabo de regresar null, pero me pregunto si esa es una buena práctica de codificación ...

Estoy preguntando V oid, no v OID. La clase Void, no la palabra clave reservada void.

También he intentado Void.class, void, Void.TYPE, new Void(), sin retorno en absoluto, sino todo lo que no funciona en absoluto. (Por razones más o menos obvias) (Consulte esta respuesta para obtener más detalles)

  • Entonces, ¿qué se supone que debo devolver si el tipo de retorno de una función es Void?
  • ¿Cuál es el uso general de la Voidclase?

Respuestas:


104

Entonces, ¿qué se supone que debo devolver si el tipo de retorno de una función tiene que ser Void?

Utilice return null. Voidno se puede crear una instancia y es simplemente un marcador de posición para el Class<T>tipo de void.

¿Qué sentido tiene Void?

Como se señaló anteriormente, es un marcador de posición. Voides lo que obtendrá si, por ejemplo, usa la reflexión para mirar un método con un tipo de retorno de void. (Técnicamente, volverá Class<Void>). Tiene otros usos variados en este sentido, como si desea parametrizar un archivo Callable<T>.

Debido al uso de genéricos en Java terminé teniendo que implementar esta función

Yo diría que algo puede funcionar mal con su API si necesita implementar un método con esta firma. Considere detenidamente si hay una mejor manera de hacer lo que desea (¿quizás pueda proporcionar más detalles en una pregunta de seguimiento diferente?). Sospecho un poco, ya que esto solo surgió "por el uso de genéricos".


13
Tener que regresar Void no es tan raro después de todo. Simplemente puede ser ordenado por ej. Callable <T>. A veces simplemente no necesita devolver algo pero no puede usar, por ejemplo, Runnable.
Bombe

Void tiene usos legítimos, como señalé. Pero dijo que "esto solo surgió por el uso de genéricos". Eso hace que parezca que le hizo algo a una colección que necesita usar Void, que yo diría que es un caso bastante excepcional.
John Feminella

Con las colecciones sería muy extraño, de hecho.
Bombe

Tanto Void.class como void.class son Class <Void> pero no son iguales. Void se usa a menudo como un argumento genérico en el valor de Map (o use Collections.newSetFromMap) y el retorno de AccessController.doPrivileged.
Tom Hawtin - tackline

@Tom: Sí. Es por eso que etiqueté el "(Técnicamente, recuperarás Clase <Void>.)" ¿Debería enmendar esa parte o crees que es precisa tal como está?
John Feminella

26

No hay forma de crear una instancia de un vacío, por lo que lo único que puede devolver es nulo.


13
Más exactamente, no hay forma de crear una instancia de un Vacío sin hacer cosas malas.
Michael Myers


20

Para aclarar por qué las otras sugerencias que dio no funcionan:

Void.classy Void.TYPEapuntan al mismo objeto y son de tipo Class<Void>, no de Void.

Por eso no puede devolver esos valores. new Void()sería de tipo Voidpero ese constructor no existe. De hecho, Voidno tiene constructores públicos y, por lo tanto, no se puede instanciar: nunca puede tener ningún objeto de tipo Voidexcepto el polimórfico null.

¡Espero que esto ayude! :-)


1
Corrección menor: Void.TYPEno apunta Void.class. Apunta a void.class.
shmosel

1

Si, por razones oscuras, DEBE usar este tipo, entonces devolver nulo parece ser una opción sensata, ya que supongo que el valor de retorno no se usará de todos modos.
El compilador te obligará a devolver algo de todos modos.
Y esta clase no parece tener un constructor público, por lo que new Void () no es posible.


No seré una obligación; es solo una convención.
Tom Hawtin - tackline

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.