2010-03-09 21 views
72

¿Cuál es la forma correcta de devolver un tipo Void, cuando no es un primitivo? P.ej. Actualmente uso null como abajo.devolviendo un objeto Void

interface B<E>{ E method(); } 

class A implements B<Void>{ 

    public Void method(){ 
     // do something 
     return null; 
    } 
} 
+1

¿Para qué necesita esto? – Bozho

+1

estoy escribiendo un intérprete para un formato de archivo, utilizando el patrón de intérprete, pero algunas expresiones no tienen valores de retorno – Robert

+2

No hay forma de crear una instancia del tipo Void, por lo que si realmente tiene que devolver algo de ese tipo, null es tu única opción. Sin embargo, probablemente no necesite el valor devuelto para nada, por lo que null debería estar bien. – Jorn

Respuesta

92

La clase Void es un marcador de posición de clase crearse instancias para almacenar una referencia al objeto de clase que representa el vacío de palabras clave de Java.

Así que cualquiera de los siguientes sería suficiente:

  • parametrización con Object y volviendo new Object() o null
  • parametrización con Void y volviendo null
  • parametrización con un NullObject tuya

No puede hacer este método void, y cualquier cosa devuelve algo. Como ese algo se ignora, puedes devolver cualquier cosa.

+2

, ¿cuál es la forma genéricamente correcta de lograr un tipo de vacío de retorno? – Robert

+0

@Robert ver mi actualización – Bozho

+0

Si desea devolver nulo como nulo, debe emitirlo en algunos casos: (nulo) nulo – for3st

0

No hay un tipo genérico que le diga al compilador que un método no devuelve nada.

Creo que la convención es utilizar objetos al heredar como un parámetro de tipo

O

Propagar el parámetro de tipo y luego dejar que los usuarios de su instantiate clase utilizando objetos y asignar el objeto a una mecanografiada variables utilizando un tipo comodín ?:

interface B<E>{ E method(); } 

class A<T> implements B<T>{ 

    public T method(){ 
     // do something 
     return null; 
    } 
} 

A<?> a = new A<Object>(); 
+1

es esta la convención para establecer el tipo de devolución para anular con genéricos - no se ve muy vacío ¿a mi? – Robert

+0

Creo que este es el camino a seguir. Cualquier usuario de la clase 'A ' no podrá usar el valor devuelto de 'method()'. –

2

Si sólo no necesita nada como su tipo, se puede utilizar sin efecto. Esto se puede usar para implementar funciones o acciones. A continuación, podría hacer algo como esto:

interface Action<T> { 
    public T execute(); 
} 

abstract class VoidAction implements Action<Void> { 
    public Void execute() { 
     executeInternal(); 
     return null; 
    } 

    abstract void executeInternal(); 
} 

O usted podría omitir la clase abstracta, y hacer la hipótesis nula de retorno en cada acción que no requiere un valor de retorno a sí mismo.

A continuación, podría utilizar esas acciones como esta:

da un método

private static <T> T executeAction(Action<T> action) { 
    return action.execute(); 
} 

se le puede llamar como

String result = executeAction(new Action<String>() { 
    @Override 
    public String execute() { 
     //code here 
     return "Return me!"; 
    } 
}); 

o, por la acción de vacío (tenga en cuenta que' no está asignando el resultado a nada)

executeAction(new VoidAction() { 
    @Override 
    public void executeInternal() { 
     //code here 
    } 
}); 
+2

¿En qué se diferencia esto de lo que ya tengo? todavía solo devuelve nulo, como sugerí – Robert

+0

¿Por qué tendrías que devolver algo más? El punto que trato de plantear es que no necesita el valor de retorno, por lo que no importa lo que devuelva. Traté de aclarar eso con mi edición. – Jorn

8

Java 8 ha introducido una nueva clase, Optional<T>, que se puede usar en tales casos.Para usarlo, usted modificar su código ligeramente de la siguiente manera:

interface B<E>{ Optional<E> method(); } 

class A implements B<Void>{ 

    public Optional<Void> method(){ 
     // do something 
     return Optional.empty(); 
    } 
} 

Esto le permite asegurarse de que siempre obtiene un valor de retorno no nulo de su método, incluso cuando no hay nada que regreso. Esto es especialmente poderoso cuando se usa junto con herramientas que detectan cuándo null puede o no ser devuelto, p. las anotaciones Eclipse @NonNull y @Nullable.

+1

Mi opinión es que esto va en la dirección incorrecta. Es mejor devolver un tipo mucho más restringido que transmita el significado mucho más claro. Tener algo que devuelva un 'Opcional ' es innecesario por la misma razón que usted da, usted _siempre_ obtiene un 'Opcional ' que está vacío y por lo tanto todos los otros métodos son inútiles. Esto es lo opuesto a por qué debería usarse un valor opcional. Lo usas porque puede o no tener un valor. Además, el compilador no puede exigir que 'method()' lo implemente correctamente. Esto fallará en el tiempo de ejecución: 'return Optional.of (null)'. – Steiny

Cuestiones relacionadas