¿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?
Daniel Rikowski
fuente

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

John Feminella
fuente
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.

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

return null es el camino a seguir.

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

Martijn
fuente
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.

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

así.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Jang-Ho Bae
fuente
2
El OP dijo que Voidno void. Las otras respuestas ya parecen cubrir bastante bien el tema.
E_net4 se mantiene alejado de Meta el