Usos para el tipo de referencia Java Void?


Hay un Java Void V V mayúscula { tipo de referencia . La única situación que he visto que se utiliza es para parametrizar Callable s

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

¿Hay otros usos para el tipo de referencia Java Void? ¿Se le puede asignar alguna otra cosa que no sea null? En caso afirmativo, ¿tiene ejemplos?

 146
Author: diraria, 2009-03-13

11 answers

Void se ha convertido en convención para un argumento genérico que no le interesa. No hay ninguna razón por la que deba usar cualquier otro tipo no instanciable, como System.

También se usa a menudo en, por ejemplo, valores Map (aunque Collections.newSetFromMap usa Boolean ya que los mapas no tienen que aceptar valores null) y java.security.PrivilegedAction.

Escribí una entrada de weblog en Void hace unos años.

 108
Author: Tom Hawtin - tackline,
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-13 18:44:39

Puede crear instancia de Void usando reflexiones, pero no son útiles para nada. Void es una forma de indicar que un método genérico no devuelve nada.

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

Imprime algo como

I have a java.lang.Void@75636731
 44
Author: Peter Lawrey,
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
2013-07-24 23:00:33

Future<Void> funciona como un encanto. :)

 26
Author: Alexander Temerev,
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
2012-12-07 12:48:19

Dado que no hay constructores públicos, yo diría que no se le puede asignar nada 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 ser utilizado en la reflexión, de lo que su Javadoc dice:

La clase Void es una clase de marcador de posición insustanciable para contener una referencia al objeto de Clase que representa la palabra clave Java void.

 19
Author: Michael Myers,
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-13 18:12:00

Todas las clases de envoltura primitivas(Integer, Byte, Boolean, Double, etc.) contiene una referencia a la clase primitiva correspondiente en un campo estático TYPE, por ejemplo:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Void fue creado inicialmente como un lugar para poner una referencia al tipo void:

Void.TYPE == void.class

Sin embargo, realmente no ganas nada usando Void.TYPE. Cuando usas void.class es mucho más claro que estás haciendo algo con el tipo void.

Como un aparte, la última vez que lo intenté, BeanShell no reconocer void.class, así que tienes que usar Void.TYPE allí.

 15
Author: Luke Woodward,
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-13 22:20:35

Cuando se utiliza el patrón de visitante puede ser más limpio usar Void en lugar de Object cuando se quiere estar seguro de que el valor devuelto será null

Ejemplo

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

Cuando implemente su visitante, puede establecer explícitamente que sea Nulo para que sepa que su visitante siempre devolverá nulo, en lugar de usar Object

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}
 6
Author: Ronan Quillevere,
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
2013-12-13 15:14:19

Antes de los genéricos, se creó para la API de reflexión, para contener el TIPO devuelto por el Método.getReturnType () para un método void, correspondiente a las otras clases de tipo primitivo.

EDIT: From the JavaDoc of Void: "La clase Void es una clase de marcador de posición inustanciable para contener una referencia al objeto de Clase que representa la palabra clave Java void". Antes de los Genéricos, soy consciente de que no sirve más que la reflexión.

 5
Author: Lawrence Dol,
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-16 17:15:20

Como no puedes instanciar Void, puedes usar Apache commons Null object , así que

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

En la primera línea, tienes un objeto, por lo que aNullObject != null sostiene, mientras que en la segunda línea no hay referencia, por lo que noObjectHere == null sostiene

Para responder a la pregunta original del póster, 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

 2
Author: Mar Bar,
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
2015-01-07 19:34:08

Void se crea para envolver su tipo de vacío primitivo. Cada tipo primitivo tiene su correspondiente tipo de referencia. Void se utiliza para instanciar 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 ...

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

Aquí, como puedes ver, no quiero nada del servidor al que estoy pidiendo crear un nuevo registro, pero public interface AsyncCallback<T> { .... } es una interfaz genérica por lo que proporciono Void ya que los genéricos no aceptan tipos primitivos

 1
Author: Adelin,
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
2012-04-21 07:30:08

También se usa comúnmente en devoluciones de llamada de finalización Async-IO cuando no se necesita un objeto Attachment. En ese caso se especifica null a la operación IO y se implementa CompletionHandler<Integer,Void>.

 0
Author: eckes,
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
2014-08-10 15:33:42

Puede ser un caso raro, pero una vez, usé Void en las clases de aspecto.

Este era un aspecto que se ejecuta después de métodos que tienen una anotación @Log, y registra el método devuelto y algo de información si el tipo de retorno del método no es nulo.

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
 0
Author: Alireza Fattahi,
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
2015-12-13 08:09:38