【问题标题】:How To Initialize final static data member with the method which throws Exception如何使用引发异常的方法初始化最终静态数据成员
【发布时间】:2015-04-16 15:16:52
【问题描述】:

我正在尝试初始化我班级的一些 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

所以

有什么办法可以做到吗?

总之,

如何使用抛出异常的方法初始化最终的静态数据成员n

【问题讨论】:

标签: java


【解决方案1】:

创建一个委托给 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);
    }
}

【讨论】:

    【解决方案2】:

    最简单的方法是编写一个处理异常的方法。

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

    【讨论】:

      【解决方案3】:

      我也不能使用静态初始化块,因为这些成员本质上是最终的。

      当然可以。只要在静态块内,您始终要么设置字段,要么向上传播异常。不会有编译错误。

      这编译得很好:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多