我只是在学习教程,而指导老师似乎掩盖了没有意义的内容
在Java中,如果我要实例化我将使用的新Gregorgian日期对象:
GregorianCalendar gc= new GregorianCalendar (2010,1,14);
但是如果我想使用数据格式对象,我会使用:
DateFormat df = DateFormat.getDateInstance();
我真的很想理解为什么dateformat不遵循实例化类的第一种方式?
我怎么知道将来要寻找类似的陷阱?
[C new X()
总是创建一个新对象,因此,如果您有多个位置需要它,则最终会得到多个X,如果单个X可以这样做,则效率可能较低。
.getDateInstance()
调用是
Factory,允许API自行决定是将相同的X甚至返回给多个调用方,还是返回一个新的X。对于非常昂贵但可重复使用/可共享的对象,这是获取它们的典型方法。
Calendar API是很久以前捐赠给Java的,其设计不尽人意。如今,对Java中“我在Calendar和/或java.util.Date中遇到问题X的问题”的典型响应是,使用is
设计良好的Joda库。[一般来说,工厂方法DateFormat.getDateInstance()
允许API根据情况选择不同的实现类,而直接使用构造函数则意味着没有这种灵活性。
顺便说一句,除非您特别想要GregorianCalendar
,否则建议的一种获取方法是Calendar.getInstance()
,如果您的语言环境合适,则会返回GregorianCalendar
。其他语言环境将返回不同的Calendar
实现。这将与您的DateFormat
示例一致。
避免使用旧的日期时间类
GregorianCalendar
是与最早的Java版本捆绑在一起的可怕的日期时间类之一。这些类在几年前被现代的[[java.time类所取代。 GregorianCalendar
类专门替换为不变的类别java.time
类被设计为immutable,使它们成为thread-safe。
这意味着您永远不会使用new
。而是调用工厂方法。了解naming conventions on such methods。
ZonedDateTime.now
捕获当前时刻。如您在the source code中看到的,ZonedDateTime
的构造函数被标记为private
,以防止我们通过new
进行实例化。在该类的内部,factory方法执行new
。您可以自己搜索源代码中的new ZonedDateTime
。 ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
顺便说一下,如果必须使用GregorianCalendar
与尚未更新为
java.time的旧代码进行互操作,则可以进行转换。请参阅添加到旧类中的新转换方法。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
...和...
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;