2012-06-18 15 views
7

Sono un fan della/fare (Trier/agente o) modello tentativo, che è meglio implementato in C# utilizzando out parametri, ad esempio:Prova/fare implementazione pattern in Java

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

Sono attualmente lavorando su un progetto Java 1.5, per il quale sto attuazione del try/fare modello utilizzando una nuova classe chiamata TryResult che viene restituito da tutti i metodi che implementano il try/fare modello:

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; 
    } 

} 

Questo funziona bene , ma eseguirò il porting di questo codice su una piattaforma diversa che utilizza J2ME e pertanto i generici non sono " t disponibile.

mie opzioni correnti sono per rimuovere i farmaci generici dalla classe TryResult sopra e usando pianura vecchio Object e la colata, o fare una nuova classe per i tipi che finirà usando (per esempio StringTryResult).

Esiste un modo migliore per implementare questo modello su J2ME/Java 1.3?

+5

Con oggetto e fusione. –

+0

@lukas Grazie per il tuo commento. Immagino che non fosse chiaro, ma è quello che intendevo con "rimuovere i generici". Spero che ci sia una soluzione migliore però. –

risposta

3

cosa si sta cercando di implementare è chiamato Maybe monad in lingue funzionali.

Ci sono esperimenti per farlo in java, vedere here e here.

Il problema è che il sistema di tipo Java non è purtroppo sufficientemente avanzato per supportare questo su larga scala. :(

Vedi Scala e Clojure per le lingue che supportano questa.

per quanto riguarda Java ME va, mi piacerebbe pensare due volte prima di attuare i tipi speciali solo per il bene di questo. e 'una bella idea, in teoria, tuttavia, renderebbe le cose ancora più difficili, ad esempio duplicando tutti i tipi nell'intera app.

+0

Grazie per la tua risposta, sicuramente qualche lettura interessante qui. Per quanto riguarda l'implementazione di tipi speciali, mi aspetto di concedere praticità e utilizzare un tipo speciale per i tipi di risultati più comuni (ad esempio 'StringTryResult' verrà usato comunemente) e utilizzare' Object' e cast per gli altri casi. –

0

Io non condivido questo un qualsiasi modo, ma un modo davvero low-tech di fare "out" variabili in Java è quello di utilizzare le matrici singolo elemento:

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