2011-12-28 87 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

相關問題