2010-04-02 9 views
16

Quindi ho una funzione che formatta una data per forzare a enum DateType dato {CURRENT, START, END} quale sarebbe il modo migliore per gestire il valore restituito con i casi che utilizzano l'istruzione switchEccezione di lancio e restituzione di valore nullo con istruzione switch

public static String format(Date date, DateType datetype) { 
    ..validation checks 

    switch(datetype){ 
    case CURRENT:{ 
     return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
    }    
    ... 
    default:throw new ("Something strange happend"); 
    } 

} 

o gettare excpetion alla fine

public static String format(Date date, DateType datetype) { 
      ..validation checks 

      switch(datetype){ 
      case CURRENT:{ 
       return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
      }    
      ... 
      } 

       //It will never reach here, just to make compiler happy 
     throw new IllegalArgumentException("Something strange happend");  
     } 

O restituire null

public static String format(Date date, DateType datetype) { 
      ..validation checks 

      switch(datetype){ 
      case CURRENT:{ 
       return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss"); 
      }    
      ... 
      } 

      return null; 
} 

Quale sarebbe la migliore pratica qui? Anche tutti i valori di enum saranno trattati nella dichiarazione del caso

+1

Se si dispone di una condizione che non dovrebbe mai accadere, userei un'AsserzioneErrore. –

+0

Grazie AssertionError ha molto più senso di IllegalArgumentException – Greg

risposta

18

Lanciare un'eccezione, poiché si tratta di un caso eccezionale.

E buttarlo fuori dallo switch, sarebbe più leggibile. Altrimenti suona come "il caso predefinito è eccezionale".

+7

Inoltre, lanciare l'eccezione al di fuori dell'istruzione switch consentirà un avviso di compilazione se non hai coperto tutti i valori enum come casi nello switch (o se l'enumerazione è in seguito espansa) . – ILMTitan

1

Vorrei andare con il primo approccio (ma con IllegalArgumentException come nel tuo secondo approccio). Dovresti includere un'istruzione di default per prevenire i casi in cui qualcuno modifica (estende) il tuo enum. Mettere l'eccezione nell'istruzione di default chiarisce al lettore che il codice non dovrebbe mai superare l'istruzione switch. Altrimenti dovrebbero controllare se davvero tutti i valori enum sono nell'interruttore.

1

Eccezioni, poiché è possibile obbedire di più al genitore rispetto a un int di ritorno singolo. Solitamente si utilizzano eccezioni dove esistono (C++) e restituiscono valori dove non (C).

9

Penso che throw new IllegalArgumentException("Something strange happend") sia la migliore soluzione.

Utilizzando null sarà solo presumibly causare un qualche NullPointerException quando si utilizza il valore di ritorno, ma sarà meno informativo di sollevare un'eccezione specifica che descrive il problema!

E sapete: errori chiari = migliore sviluppo.

Problemi correlati