我最近继承的应用程序是关于构造函数的全部弃用警告:
Date d = new Date(int year, int month, int day)
有没有人知道或者可以指出为什么像这样简单的东西被这样的东西"替换"的原因:
Date d = null; Calendar cal = GregorianCalendar.getInstance(); cal.set(1900 + year, month, day); d = cal.getTime();
现在,显然弃用警告本身并不是一个问题,但你能想象如果这个构造函数被删除,数百万的LOC会在痛苦中哭泣吗?
在我简短的基准测试中,后者需要大约50%的时间来执行.
最初,Date
旨在包含有关日期的所有逻辑,但API设计者最终意识到他们迄今为止所使用的API严重不足,无法彻底扩展以正确处理时区,区域设置,不同日历,夏令时等问题等
因此,他们创建Calendar
了处理所有复杂性,并降级Date
为简单的时间戳,弃用了处理格式化,解析和单个日期字段的所有功能.
顺便说一句,在内部这些方法,如Date(int, int, int)
构造函数现在调用Calendar
,所以如果你看到速度的差异,那么你在调用时做错了Calendar
.
底线:这不是Java的Calendar
API过于复杂,它是人类的日期概念,唯一的问题Calendar
是它提供了对最常见用法的快捷方式.
Java Date API一直受到批评,例如参见这个帖子.
您可能需要查看Joda-Time或Apache Commons Lang以获取其他日期/时间实用程序.
答案是便携性.
班级Date
不是很灵活.您可以定义日期,但不能将其转换为其他日历格式.所以Sun决定使用额外的类层次结构(Calendar
)来使其更灵活.
尽管如此,它并不是很方便.
主要是因为原始java.util.Date臃肿,并没有完全时区感知,也没有国际化友好.
但是,Date仍在使用,非常好,在Value Objects中,或者说作为数据类型.只要你明确地使它成为不可变的,你就可以放心.我倾向于认为它必须是不可变的,为了其他目的我们有Calendar来操纵.在预期的操作很多的地方,人们应该考虑像Joda-Time这样的东西.
将帖子
只是不要在后面的代码中实例化Date.它毫无用处.您可以为您的基准测试获得更好的结果.