繁体   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