2010-04-02 31 views
16

所以我有一個函數,格式化日期以強制給定枚舉DateType {CURRENT,START,END} 什麼是最好的方式來處理返回值與使用switch語句的情況用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"); 
    } 

} 

或結束

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

拋出錯誤時拋出或返回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; 
} 

這裏最好的做法是什麼?所有枚舉值將在case語句中處理

+1

如果你有一個不應該發生的情況,我會使用一個AssertionError。 – 2010-04-02 17:41:22

+0

Thanks AssertionError比IllegalArgumentException更有意義 – Greg 2010-04-02 18:12:03

回答

18

拋出一個異常,因爲這是一種特殊情況。

把它扔到switch以外,它會更具可讀性。否則,它聽起來像「默認情況是例外」。

+7

此外,如果您沒有在交換機中覆蓋所有枚舉值(或者如果枚舉稍後展開),則在switch語句之外拋出異常將允許編譯警告, 。 – ILMTitan 2010-04-05 14:50:21

1

我會採取第一種方法(但與IllegalArgumentException在你的第二種方法)。你應該包含一個默認語句來防止有人修改(擴展)你的枚舉的情況。將這個異常放在默認語句中會讓讀者清楚,代碼永遠不會超過switch語句。否則,他們將不得不檢查是否所有的枚舉值都在交換機中。

1

異常,因爲您可以更多地服從父項而不是單個返回int可以。通常情況下,你使用異常(C++),並返回不是(C)的值。

9

我認爲throw new IllegalArgumentException("Something strange happend")是最好的實踐。

使用null只會presumibly原因當您使用的返回值,但它會不夠豐富比養問題說明特定異常的NullPointerException的地方!

而且你知道:清除錯誤=更好的開發。