定义Java常量日期的最佳方法

6
我想定义一些常量,特别是在我的领域存在之前就需要的日期和日历。我有一些代码可以工作,但很丑陋。我正在寻求改进建议。
    public static final Calendar beforeFirstCalendar = new GregorianCalendar(1776, 6, 4);
    public static final Date beforeFirstDate = beforeFirstCalendar.getTime();
我将它们设置为1776年7月4日。我不想使用“working”变量。
谢谢。

2
请注意,将其声明为“final”并不意味着它是不可变的。您可能希望查看JodaTime,它的“DateTime”是不可变的,并且可以安全地声明为“final”。 - BalusC
3个回答

7
我不确定我是否理解了......但这不起作用吗?
public static final Calendar beforeFirstCalendar;
static {
    beforeFirstCalendar = GregorianCalendar.getInstance();
    beforeFirstCalendar.set(1776, 6, 4, 0, 0, 1);
}
public static final Date beforeFirstDate = beforeFirstCalendar.getTime();

1
你甚至可以将 static {} 的第一行放回声明中,以节省一行代码:public static final Calendar beforeFirstCalendar = Calendar.getInstance(); 它并不是一个不可变类,你仍然可以在任何地方编辑它(而 final 在这方面真的没有什么改变)。 - BalusC

5

我会将其提取到一个方法中(在一个工具类中,假设其他类也需要这个方法):

class DateUtils {
  public static Date date(int year, int month, int date) {
    Calendar working = GregorianCalendar.getInstance();
    working.set(year, month, date, 0, 0, 1);
    return working.getTime();
  }
}

然后,只需简单地:
public static final Date beforeFirstDate = DateUtils.date(1776, 6, 4);

2

使用XML字符串表示法可能更清晰。这种表示法更易读,并且避免了您想要消除的本地变量:

import javax.xml.bind.DatatypeConverter;

Date theDate = DatatypeConverter.parseDateTime("1776-06-04T00:00:00-05:00").getTime()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接