2012-08-01 19 views
17

Un problema con el uso de guayaba tipo Optional como argumentos de los métodos es que no se puede simplemente escribirOptional.absent() Los valores a los métodos concisa

// method declaration 
public void foo(Optional<String> arg); 

// compiler error 
foo(Optional.absent()); 

debido a la inferencia de tipos en su defecto, sino que hay que añadir el escriba explícitamente:

// real method call 
foo(Optional.<String> absent()); 

¿Cómo puedo evitarlo?

+6

No hay realmente una mejor manera, pero para su información, 'Opcional' tiende a ser más comúnmente usado como un valor de retorno que como un tipo de argumento de método. (Es mucho más fácil olvidar que un valor de retorno de un método puede ser nulo que un argumento para el método que está escribiendo). –

+0

Con una expresión complicada, utilizo una variable local de un tipo apropiado (en el RHS de la tarea) no se necesita ninguna variable de tipo) para obtener algo más legible. Pero aquí no se puede hacer nada hasta que llegue la resolución (probablemente JDK8). – maaartinus

+3

@LouisWasserman Todavía hay ventajas de usar 'Optional' como argumento: 1) dejar en claro a los usuarios de API que un argumento puede estar ausente; 2) haciendo que sea fácil pasar el valor de devolución de otro método al suyo. –

Respuesta

-4

Sólo cuando se escribe la pregunta, pensé en tener

public class GuavaConstants { 
    @SuppressWarnings({ "raw" }) 
    public static final Optional ABSENT = Optional.absent(); 

    // similar for empty ImmutableList, etc. 
} 

y luego la llamada puede ser similar

@SuppressWarnings({ "unchecked" }) 
foo(GuavaConstants.ABSENT); 

¿Hay un mejor enfoque?

+16

Sí, 'foo (Opcional. ausente())' es mejor. Esto no me parece algo que deberías estar haciendo en absoluto. – ColinD

+3

@ColinD, publique esto como respuesta; por mi parte, lo votaré de inmediato. La respuesta aceptada (y única) es bastante desagradable. –

7

Si se trata de un pequeño conjunto de Optional<> tipos (por ejemplo, la mayoría de las cadenas o un puñado de otros tipos), acaba de crear algunos métodos auxiliares que se unen el argumento de tipo para usted:

public final class AbsentValues { 
    public static Optional<String> absentString() { 
     return Optional.<String>absent(); 
    } 
} 

Puede incluso importar estos estáticamente para dar lugar a un código más limpio:

import static AbsentValues.*; 

... 

foo(absentString()); 

Por menos comunes Optional<> tipos, basta con especificar el argumento de tipo explícitamente. Puede que no sea lindo, pero es correcto.

-1

Por lo tanto, esta es la forma correcta de hacerlo. Si no fuera por algo más, permítanme al menos mostrarlo aquí para mi futura referencia, para todos los que no lean las preguntas, como yo :) Gracias a ColinD (y Alexey).

foo(Optional.<String>absent()) 
Cuestiones relacionadas