Hay un tipo de referencia Java Void
- mayúscula V-- . La única situación que he visto que se usa es para parametrizar s Callable
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
¿Hay otros usos para el Void
tipo de referencia de Java ? ¿Se le puede asignar alguna otra cosa que no sea null
? En caso afirmativo, ¿tienes ejemplos?
Respuestas:
Void
se ha convertido en una convención para un argumento genérico en el que no está interesado. No hay ninguna razón por la que deba usar ningún otro tipo no instanciable, comoSystem
.También se usa a menudo en, por ejemplo,
Map
valores (aunque losCollections.newSetFromMap
usosBoolean
como mapas no tienen que aceptarnull
valores) yjava.security.PrivilegedAction
.Me escribió una entrada de blog en
Void
unos pocos años atrás.fuente
java.lang.Void
. / Josh Bloch popularizó la convención, aunque una vez que la haya visto, es la opción obvia.Puede crear una instancia de Void usando reflejos, pero no son útiles para nada. Void es una forma de indicar que un método genérico no devuelve nada.
imprime algo como
fuente
System.exit(0)
). Tiendo a escribir clases de utilidad con un constructor comoprivate Void() { throw new Error(); }
. Algunos pueden preferir una enumeración sin valor.Future<Void>
Funciona como encanto. :)fuente
Future<?>
, ya que el futuro a menudo tendrá un valor legítimo (de noVoid
tipo) pero se usa en un contexto que no le importa el valor.CompletableFuture<Void>
funciona como un encanto también.Dado que no hay constructores públicos , diría que no se le puede asignar otra cosa que no sea
null
. Solo lo he usado como marcador de posición para "No necesito usar este parámetro genérico", como muestra su ejemplo.También podría usarse en la reflexión, por lo que dice su Javadoc :
fuente
Todas las clases de envoltura primitivas (
Integer
,Byte
,Boolean
,Double
, etc.) contienen una referencia a la clase primitiva correspondiente en una estáticaTYPE
campo, por ejemplo:Void
inicialmente se creó como un lugar para poner una referencia alvoid
tipo:Sin embargo, realmente no ganas nada con el uso
Void.TYPE
. Cuando usasvoid.class
es mucho más claro que estás haciendo algo con elvoid
tipo.Como comentario aparte, la última vez que lo probé, BeanShell no lo reconoció
void.class
, por lo que debes usarloVoid.TYPE
allí.fuente
Cuando usa el patrón de visitante , puede ser más limpio usar Void en lugar de Object cuando desea asegurarse de que el valor de retorno sea nulo
Ejemplo
Cuando implemente a su visitante, puede establecer explícitamente que OUT sea vacío para que sepa que su visitante siempre devolverá nulo, en lugar de usar Object
fuente
Antes de los genéricos, se creó para la API de reflexión, para contener TYPE devuelto por Method.getReturnType () para un método vacío, correspondiente a las otras clases de tipos primitivos.
EDITAR: Del JavaDoc de Void: "La clase Void es una clase de marcador de posición que no se puede desinstalar para contener una referencia al objeto Class que representa la palabra clave Java void". Antes de los genéricos, no soy consciente de otro uso que no sea la reflexión.
fuente
Void
. Consulte stackoverflow.com/questions/34248693/…Como no puede crear una instancia de Void, puede usar el objeto nulo Apache commons , por lo que
en la primera línea, tiene un objeto, por lo que se
aNullObject != null
mantiene, mientras que en la segunda línea no hay referencia, por lo que senoObjectHere == null
mantienePara responder a la pregunta original del cartel, el uso para esto es diferenciar entre "la nada" y "nada", que son cosas completamente diferentes.
PD: Di no al patrón de objeto nulo
fuente
Void es create para envolver su tipo de vacío primitivo. Cada tipo primitivo tiene su tipo de referencia correspondiente. Void se usa para crear una instancia de una clase genérica o el uso de un método genérico, un argumento genérico que no le interesa. Y aquí hay un ejemplo ...
aquí, como puede ver, no quiero nada del servidor al que le pido que cree nuevos registros, pero
public interface AsyncCallback<T> { .... }
es una interfaz genérica, por lo que proporciono Void ya que los genéricos no aceptan tipos primitivosfuente
También se usa comúnmente en devoluciones de llamada de finalización de Async-IO cuando no tiene la necesidad de un
Attachment
objeto. En ese caso, especifique nulo para la operación e implementación de IOCompletionHandler<Integer,Void>
.fuente
Puede ser un caso raro, pero una vez, lo usé
Void
en clases de aspecto.Este era un aspecto que se ejecuta después de los métodos que tienen una
@Log
anotación, y registra el método devuelto y alguna información si el tipo de retorno del método no es nulo.fuente