何时使用New来实例化一个类

3

我正在学习一个教程,但是讲师好像对某些东西只字未提,这让我感到困惑。

如果我想要在Java中实例化一个新的Gregorgian日期对象,我可以使用以下代码:

GregorianCalendar gc= new GregorianCalendar (2010,1,14);

但如果我想使用数据格式对象,我将使用:

DateFormat df = DateFormat.getDateInstance();
  1. 我真的很想知道为什么DateFormat不遵循类的第一种实例化方式?

  2. 以后如何知道类似问题的注意事项?


getDateInstance() 是 DateFormat 的一个静态方法,它的工作几乎与其它方法相同,只不过它会尝试在给定的区域设置中使用给定的时间和/或日期样式创建 DateFormat,并检查实例是否已经创建,从而避免额外的工作。有关详细信息,请查看 DateFormat 的源代码 DateFormat - Umesh Awasthi
4个回答

5

您应当始终查阅API文档以了解如何使用它。

new X()总是创建一个新对象,因此如果您需要多个地方使用它,则最终会得到多个X,如果单个X就可以完成,则可能效率低下。

.getDateInstance()调用是一个工厂,允许API自行决定是否将相同的X返回给多个调用者,或为每个调用者返回一个新的X。对于非常昂贵但可重复/共享的对象,这是您获取它们的典型方式。

日历API很久以前就捐赠给Java了,设计不太好。现在,在Java中遇到“我有关于Calendar和/或java.util.Date的问题”时,通常的回答是使用Joda库,该库已经被证明设计良好。对于使用Java 8或更高版本的新代码,请使用Basil Bourque所评论的新的java.time类。


更新:Joda-Time 项目现已进入维护模式,其创建者 Stephen Colebourne 已经开始领导 JSR 310,定义了内置于 Java 8+ 的 java.time 类。请参阅 Oracle 的教程 - Basil Bourque

3
核心Java API的设计不合理且不一致,这是一个简短的回答。通常,这些不一致之处没有充分的理由,你只能忍受它们。
更普遍地说,像DateFormat.getDateInstance()这样的工厂方法允许API根据情况选择不同的实现类,而直接使用构造函数则没有这种灵活性。
顺便说一下,除非你特别想要一个GregorianCalendar,否则获取它的推荐方法是Calendar.getInstance(),如果你的区域设置适当,它将返回一个GregorianCalendar。其他区域设置将返回不同的Calendar实现。这与你的DateFormat示例一致。

@Peter:我并没有说它是,那只是我在最后添加的一条注释。我在第二段解释了它们之间的区别。 - skaffman

1

0

Thorbjørn Ravn Andersen的回答是正确的。这里有一些更多的想法。

避免使用旧版日期时间类

GregorianCalendar是最早版本Java捆绑的可怕日期时间类之一,由不理解日期时间处理的人设计。

这些类已经被现代的java.time类取代多年了。GregorianCalendar类被ZonedDateTime特别替换。

Table of date-time types in Java, both modern and legacy

不可变类

java.time 类被设计为不可变的,使它们具有线程安全性

这意味着你永远不会使用 new。而是调用工厂方法。阅读有关这种方法的命名惯例

让我们捕捉当前时刻,就像某个地区(一个时区)的人们使用的挂钟时间一样。我们调用ZonedDateTime.now来捕捉当前时刻。正如您在源代码中所看到的那样,ZonedDateTime的构造函数被标记为private,以防止我们通过new实例化。在该类内部,工厂方法执行new。您可以自己查看,在源代码中搜索new ZonedDateTime

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

顺便提一句,如果你必须使用 GregorianCalendar 与尚未更新为 java.time 的旧代码进行交互,你可以进行转换。请查看添加到旧类中的新转换方法。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

…and…

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

Table of which java.time library to use with which version of Java or Android


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