¿Qué devuelvo si el tipo de retorno de un método es Nulo? (No vacío!)


Debido al uso de Genéricos en Java, terminé teniendo que implementar una función que tenía Void como tipo de retorno:

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

Y el compilador exige que devuelva algo. Por ahora solo estoy regresando null, pero me pregunto si eso es una buena práctica de codificación...

También he intentado Void.class, void, Void.TYPE, new Void(), no hay retorno en absoluto, pero todo eso no funciona en absoluto. (Por razones más o menos obvias) (Ver esta respuesta para más detalles)

  • So ¿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 clase Void?

EDIT: Solo para repuesto el downvotes: estoy preguntando sobre Void, no void. La clase Void, no la palabra clave reservada void.

Author: Community, 2009-03-24

5 answers

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

Use return null. Void no puede ser instanciado y es simplemente un marcador de posición para el tipo Class<T> de void.

¿Cuál es el punto de Void?

Como se señaló anteriormente, es un marcador de posición. Void es lo que obtendrá si, por ejemplo, usa reflexión para mirar un método con un tipo de retorno de void. (Técnicamente, volverás Class<Void>.) Tiene otros surtidos utiliza a lo largo de estas líneas, como si desea parametrizar un Callable<T>.

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

Yo diría que algo puede ser funky con su API si necesita implementar un método con esta firma. Considere cuidadosamente si hay una mejor manera de hacer lo que desea (¿tal vez pueda proporcionar más detalles en una pregunta de seguimiento diferente?). Soy un poco sospechoso, ya que esto solo surgió " debido a the use of generics".

 100
Author: John Feminella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 01:54:45

No hay forma de crear una instancia de un Void, por lo que lo único que puede devolver es null.

 23
Author: Jon Bright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-24 09:39:35

return null es el camino a seguir.

 18
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-24 09:36:44

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

Void.class y Void.TYPE apuntan al mismo objeto y son de tipo Class<Void>, no de Void.

Es por eso que no puede devolver esos valores. new Void() sería de tipo Void pero ese constructor no existe. De hecho, Void no tiene constructores públicos y, por lo tanto, no puede ser instanciado: Nunca puede tener ningún objeto de tipo Void excepto el polimórfico null.

Espero que esto ayude! :-)

 17
Author: Martijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-03 10:38:18

Si, por razones oscuras, debe usar este tipo, entonces devolver null parece ser una opción sensata, ya que supongo que el valor devuelto 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.

 0
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-24 09:38:19