java - tipos - que es void
¿Cuál es la diferencia entre java.lang.Void y void? (6)
En API
"La clase Void es una clase de marcador de posición no ejecutable para contener una referencia al objeto Class que representa la palabra clave Java void".
- ¿Qué es una clase de titular de lugar "no ejecutable"? ¿Cuándo se usará
java.lang.Void
? Si la clase es "desinstalable", ¿de qué sirve? - ¿Cuál es la diferencia entre
java.lang.Void
yvoid
?
Void es una característica de AutoBoxing (desde JDK 1.5) de vacío.
Bueno, se explica por sí mismo que Void es referencia, mientras que el vacío es un tipo primitivo.
Entonces, ¿dónde llega el requisito de tener que usar Void?
Un uso común con tipos genéricos donde no podemos usar primitivo.
Digamos, en el caso de Android
AsyncTaks<Params, Progress, Result>
qué ocurre si no deseo obtener la actualización de Progress. No puedo usar void (tipo primitivo) aquí requerimos java.lang.Void
El único punto de Void
es mantener Void.TYPE
, que es algo así como void.class
. Si tiene una referencia reflexiva a un método que devuelve void
y obtiene su tipo de devolución, devolverá Void.TYPE
.
No puedes, y no debes, usarlo para nada más.
Otro ejemplo para usar Void
es SwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();
Void es útil porque a veces necesita especificar el tipo de devolución de un método fuera del método en sí.
Por ejemplo, tome esta expresión java 8 lambda , que verifica si un objeto EventResource tiene ciertas propiedades, usando un método llamado checkBenefitConcertInCentralPark
, pasado al método checkCreatedEvent
:
eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);
El método checkBenefitConcertInCentralPark
se define así (tenga en cuenta el uso de Void):
public static Void checkBenefitConcertInCentralPark(EventResource eventResource) {
// JUnit code here...
// assertThat(blablabla :) )
return null; // we can only return null at the end of a method when returning Void
}
y luego el método checkBenefitConcertInCentralPark
se pasa al método checkCreatedEvent
.
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}
java.lang.Void
es análogo a java.lang.Integer
. Integer
es una forma de boxeo de valores del tipo primitivo int
. Void
es una forma de valores de boxeo del tipo primitivo void
.
"¡Pero espera, el void
no tiene ningún valor posible!"
¡Derecha! Eso es lo que hace java.lang.Void
"desinstalable". :)
Es una buena característica del sistema de tipo Java que cada tipo primitivo tenga un equivalente en caja. int
tiene Integer
, long
tiene Long
, byte
tiene Byte
... y void
tiene Void
. Sería extraño y asimétrico si Void
no existiera.
"Entonces, ¿cuál es la diferencia entre java.lang.Void
y void
?"
Fácil. void
es un tipo primitivo. Void
es un tipo de referencia que hereda de Object
. Son similares en que ninguno de ellos tiene ningún valor posible; pero, sin embargo, son dos tipos muy diferentes, desde el punto de vista del sistema de tipos.
"Pero no tengo ningún uso para Void
en mis programas".
Y no tengo ningún uso para GarbageCollectorMXBean
en el mío. Algunas características no tienen usos no oscuros. Esta bien.
El uso más común de Void
es para la reflexión, pero ese no es el único lugar donde se puede usar.
void
es una palabra clave que significa que una función no genera un valor.
java.lang.Void
es un tipo de referencia, luego el siguiente es válido:
Void nil = null;
(Hasta ahora no es interesante ...)
Como tipo de resultado (una función con un valor de retorno de tipo Void
) significa que la función * siempre * devuelve null
(no puede devolver nada que no sea null
, porque Void
no tiene instancias).
Void function(int a, int b) {
//do something
return null;
}
¿Por qué me gustaría una función que siempre devuelve nulo?
Antes de la invención de los genéricos, no tenía un caso de uso para Void
.
Con los genéricos, hay algunos casos interesantes. Por ejemplo, un Future<T>
es un titular para el resultado de una operación asincrónica realizada por otro hilo. Future.get
devolverá el valor de operación (de tipo T
) y bloqueará hasta que se realice el cálculo.
Pero ... ¿Qué pasa si no hay nada que devolver? Simple: use un Future<Void>
. Por ejemplo, en Google App Engine, la operación de delete
servicio de almacenamiento de datos asincrónico devuelve un futuro . When
. When
is invoked on that future,
get () is invoked on that future,
se devuelve null` después de que se completa la eliminación. Uno podría escribir un ejemplo similar con Callable s.
Otro caso de uso es un Map
sin valores, es decir, un Map<T,Void>
. Tal mapa se comporta como un Set<T>
, luego puede ser útil cuando no hay una implementación equivalente de Set
(por ejemplo, no hay WeakHashSet
, entonces uno podría usar un WeakHashMap<T,Void>
).