2012-06-18 26 views
7

Soy un fan de la DO (o/hacedor Trier) patrón de try /, que es el más implementado en C# usando out parámetros, por ejemplo:Try/hacer patrón de aplicación en Java

DateTime date; 
if (DateTime.TryParse("2012-06-18", out date)) 
{ 
    //Do something with date 
} 

estoy

public class TryResult<ResultType> { 

    private boolean mSuccess = false; 
    private ResultType mResult = null; 

    public TryResult(boolean success, ResultType result) { 
     super(); 
     this.mSuccess = success; 
     this.mResult = result; 
    } 

    public boolean isSuccess() { 
     return mSuccess; 
    } 

    public ResultType getResult() { 
     return mResult; 
    } 

} 

Esto está funcionando bien: trabaja actualmente en un proyecto Java 1.5, para el que estoy poniendo en práctica el try/do patrón usando una nueva clase llamada TryResult que se devuelve desde cualquiera de los métodos que implementan el patrón de prueba/hacer , pero voy a portar este código a una plataforma diferente que utiliza J2ME, y por lo tanto no son genéricos t disponible.

Mis opciones actuales son o bien eliminar los genéricos de la clase TryResult anteriormente y utilizando el viejo y simple de fundición y Object, o hacer una nueva clase de los tipos I va a terminar usando (por ejemplo StringTryResult).

¿Existe alguna forma mejor de implementar este patrón en J2ME/Java 1.3?

+5

Con objeto y casting. –

+0

@lukas Gracias por tu comentario. Supongo que no estaba claro, pero eso es lo que quise decir con 'eliminar los genéricos'. Sin embargo, espero que haya una mejor solución. –

Respuesta

3

Lo que estamos tratando de implementar es llamado Maybe monad en lenguajes funcionales.

Existen experimentos para hacer esto en Java, consulte here y here. El problema es que el sistema de tipos de Java lamentablemente no es lo suficientemente avanzado como para soportar esto en gran escala. Además, las bibliotecas estándar no admiten nada de eso, lo que reduce el uso de dicho constructo solo a su propio código :(

Ver Scala y Clojure para los idiomas que apoyan esto.

en lo que va Java mE, pensaría dos veces antes de la aplicación de tipos especiales sólo por el bien de esto. es una buena idea en teoría , sin embargo, haría las cosas más difíciles, por ejemplo, duplicar todos los tipos en toda su aplicación.

+0

Gracias por su respuesta, definitivamente algunas lecturas interesantes aquí. En cuanto a la implementación de tipos especiales, espero ceder a la practicidad y usar un tipo especial para los tipos de resultados más comunes (por ejemplo, 'StringTryResult' se usará comúnmente) y usar' Object' y casting para los demás casos. –

0

no apoyo esta manera ninguna, pero de una manera muy baja tecnología que haga "out" variables en Java es utilizar un solo conjuntos de elementos:

String input = ...; 
Date[] date = { null }; 
if (DateParser.tryParse(input, date)) { 
    System.out.println(date[0]); 
} 
Cuestiones relacionadas