2015-04-16 60 views
1

我正在嘗試初始化我的一些類的static final數據成員。如何使用拋出異常的方法初始化最終靜態數據成員異常

這就是我想要的。

package mypkg; 
import java.util.*; 
import java.text.SimpleDateFormat; 
public class Customer { 
... 
private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); 
private static final Date DOB_MIN=sdf.parse("1-1-1985"); 
private static final Date DOB_MAX=sdf.parse("31-12-1995"); 
... 
} 

但我知道,.parse()拋出ParseException必須處理。

但正如你可以看到你不能在那裏使用try-catchException Delegation

另外我不能使用static initializer block作爲那些成員本質上是final

SO

有什麼辦法可以做到這一點?

總之,

如何初始化與拋出抗辯Ñ

+1

可能重複(http://stackoverflow.com/questions/8367950/cant-define [因爲它拋出一個異常,不能定義一個私有靜態final變量] -a-私人靜態最終變量 - 因爲,它拋出-AN-除外) –

回答

2

創建靜態解析功能委託給sdf.parse並捕捉異常的方法最終靜態數據成員。

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); 
private static final Date DOB_MAX = safeParse("31-12-1995"); 

static Date safeParse(String input) { 
    try { 
     return sdf.parse(input); 
    } catch (ParseException e) { 
     throw new RuntimeException(e); 
    } 
} 
1

最簡單的方法是編寫一個處理異常的方法。

private static Date parse(String date) { 
    try { 
     return sdf.parse(date); 
    } catch (Exception ex) { 
     throw new IllegalStateException("Failed to initialise date "+date, ex); 
    } 
} 

但是你應該非常小心SimpleDateFormat,因爲它不是線程安全的,所以大家共享之間的相同的實例可能不是一個好主意。如果你只用它來初始化你的常量,那很好,但如果你打算在其他地方使用它,請確保sdf.parse()只在同步塊中被調用。

1

此外,我不能使用靜態初始化塊,因爲這些成員本質上是最終的。

當然可以。只要在靜態塊內部,您總是設置字段或傳播異常。將不會有編譯器錯誤。

這編譯就好:

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); 
    private static final Date DOB_MIN; 
    private static final Date DOB_MAX; 

    static{ 
     try { 
      DOB_MIN=sdf.parse("1-1-1985"); 
      DOB_MAX=sdf.parse("31-12-1995"); 
     } catch (ParseException e) { 
      //handle your exception here. 
      //could rethrow unchecked exception too 

      throw new IllegalStateException("invalid dates"); 
     } 

    } 
相關問題