簡體   English   中英

如何使用引發異常的方法初始化最終的靜態數據成員

[英]How To Initialize final static data member with the method which throws Exception

我正在嘗試初始化類的某些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的。

所以

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

簡而言之,

如何使用引發異常的方法初始化最終的靜態數據成員

創建一個靜態解析函數,委派給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);
    }
}

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

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()

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

你當然可以。 只要在靜態塊內,您就始終可以設置字段或傳播異常。 不會有編譯器錯誤。

這樣編譯就可以了:

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

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM