2011-12-28 71 views
3

我只是通过教程去和教练似乎掩盖了一些东西,没有任何意义什么时候使用新实例化一个类

在Java中,如果我找实例化一个新的Gregorgian Date对象我会用:

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

,但如果我希望使用的数据格式对象,我会用:

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

  2. 我怎么知道在将来寻找类似的疑难杂症?

+0

'getDateInstance()'是日期格式的静态方法和它做几乎同样的工作,除了它试图在给定的语言环境创建具有给定的时间和/或日期样式日期格式,并检查它的实例已经因此避免了额外的工作。查看DateFormat的源代码以获取详细信息[DateFormat](http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/text/java/text/DateFormat。 java的。htm) – 2011-12-28 10:41:56

回答

4

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

A new X()总是创建一个新的对象,所以如果你有多个地方你需要它,你最终会得到多个X'es,如果一个X会做,这可能是低效的。

.getDateInstance()呼叫是允许API自行决定是否相同的X返回甚至给多个来电或新的每一个。对于非常昂贵但可重复使用/可共享的对象,这是获取它们的典型方式。

很久以前,Calendar API被捐赠给了Java,并且设计得不尽如人意。现在,java中对“我在Calendar和/或java.util.Date中遇到问题X”的典型回应是使用设计良好的Joda库,其中

3

简而言之,核心Java API设计不佳且不一致。这些不一致通常没有什么好的理由,你只需要和他们一起生活。

更一般地说,像DateFormat.getDateInstance()这样的工厂方法允许API根据情况选择不同的实现类,而直接使用构造器意味着没有这种灵活性。顺便说一句,除非你特别想要一个GregorianCalendar,那么推荐的获取方法之一是Calendar.getInstance(),如果你的语言环境适合,它将返回GregorianCalendar。其他语言环境将返回不同的Calendar实现。这将与您的DateFormat示例一致。

+0

@彼得:我没有说这是,那只是我在最后添加的一个注释。我解释第二段中的差异。 – skaffman 2011-12-28 10:46:40

+0

对不起,我有点误读 – Peter 2011-12-28 10:49:15

相关问题