2010-04-02 11 views
16

Tak więc mam funkcję, która formatuje datę wymuszenia na konkretną enum DateType {BIEŻĄCY, START, END} jaki byłby najlepszy sposób obsługi zwracanej wartości w przypadkach, które używają instrukcji switchWyrzucanie wyjątku vs zwracanie wartości pustej z instrukcją przełącznika

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

} 

lub wyrzucić excpetion na końcu

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

lub zawracania zerowy

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

Jaka byłaby tutaj najlepsza praktyka? Również wszystkie wartości wyliczeniowe będą obsługiwane w przypadku:

+1

Jeśli masz warunek, który nigdy nie powinien się zdarzyć, użyłbym AssertionError. –

+0

Dzięki AssertionError ma więcej sensu niż IllegalArgumentException – Greg

Odpowiedz

18

Wyrzuć wyjątek, ponieważ jest to wyjątkowy przypadek.

I wyrzucić go poza switch, byłoby bardziej czytelne. W przeciwnym razie brzmi to jak "domyślny przypadek jest wyjątkowy".

+7

Dodatkowo, wyrzucenie wyjątku poza instrukcją switch pozwoli na ostrzeżenie kompilacji, jeśli nie uwzględniłeś wszystkich wartości wyliczonych jako przypadków w przełączniku (lub jeśli wyliczenie zostanie później rozwinięte) . – ILMTitan

1

Podejdę z pierwszym podejściem (ale z IllegalArgumentException jak w drugim podejściu). Powinieneś dołączyć oświadczenie domyślne, aby chronić się przed przypadkami, gdy ktoś modyfikuje (wyszarza) twoje wyliczenie. Dodanie wyjątku do domyślnej instrukcji wyjaśnia czytelnikowi, że kod nigdy nie powinien ominąć instrukcji switch. W przeciwnym razie musieliby sprawdzić, czy rzeczywiście wszystkie wartości wyliczeniowe są w przełączniku.

1

Wyjątki, ponieważ można posłużyć się bardziej rodzicem niż pojedynczym zwrotnym int. Zwykle korzystasz z wyjątków tam, gdzie one istnieją (C++) i zwracasz wartości tam, gdzie nie (C).

9

Myślę, że throw new IllegalArgumentException("Something strange happend") jest najlepszy pratice.

Korzystanie null będzie tylko presumibly spowodować NullPointerException gdzieś po użyciu wartości zwracanej ale będzie mniej niż informacyjny podnosząc specyficzny wyjątek, który opisuje problem!

I wiesz: jasne błędy = lepszy rozwój.

Powiązane problemy