我正在尝试初始化我的一些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-catch
或Exception Delegation
。
此外,我无法使用static initializer block
,因为这些成员的性质为final
。
SO
有没有办法实现这个目标?
简而言之,
如何使用抛出Exceptio的方法初始化最终静态数据成员 n
答案 0 :(得分: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 :(得分: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()
。
答案 2 :(得分: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");
}
}