2015-03-13 107 views
2

請問new Calendar()Calendar.getInstance()有什麼不同?爲什麼Calendar類沒有公共構造函數?

問題就這麼簡單...........由於系統拒絕發佈它,我只是在這裏複製一些廢話。

private static Calendar calendar = Calendar.getInstance(); 
public static int getCalendar(long time, int calendarConst) { 
    calendar.setTimeInMillis(time); 
    return calendar.get(calendarConst); 
} 
+0

您是否嘗試過讀取'Calendar.getInstance()'的來源以查看實際發生的情況? – Tom 2015-03-13 08:35:12

回答

2

在Effective Java第二版中詳細介紹了構造函數和靜態工廠方法之間的區別,這非常值得一讀。

這裏的主要區別是什麼這兩個回報:

  • 構造函數總是返回其上調用構造函數的具體類的非空實例,或者拋出一個異常而你不知道t得到對部分構造實例的引用;
  • 靜態工廠方法可以返回一個子類或null(或拋出異常)。

後一種情況正是Calendar.getInstance()做:你顯然不回來的Calendar自身的實例,因爲它是抽象的,而是你可能會得到一個GregorianCalendarJapaneseImperialCalendar

這樣可以使Calendar從客戶端代碼執行:您可以對Calendar進行更改,而無需客戶端進行更改。

5

我認爲答案很簡單Calendar是一個抽象類,所以我們不能創建它的一個實例。現在,當您撥打Calendar.getInstance時,將創建GregorianCalendar實例。

+0

不知道爲什麼他們做這個類摘要。但是你去了。 – bijiDango 2015-03-13 07:53:38

+0

只需添加Calendar.getInstance()也具有受保護的構造函數。現在構造函數受到保護而不是私有的原因是允許子類擴展它。現在,由於構造函數受到保護,只有同一個包中的類可以擴展Calendar。 – 2015-03-13 07:58:10

+1

@bijiDango請查看http://en.m.wikipedia.org/wiki/List_of_calendars中的使用日曆列表,然後說出您認爲哪一個應該由Calendar,非抽象類表示;然後考慮其他日曆是否真的是其中的子類型。 – 2015-03-13 08:04:02

0

當您執行new Calendar()時,它會從默認日曆實例中創建新的日曆實例。有時通過構造函數創建實例與從Factory方法創建不一樣。這就是爲什麼它使用Factory方法創建實例。

而且,

Calendar.getInstance()是一個本地方法,並記下本地方法沒有體/執行。他們已經從系統中實施。

它寫在這裏:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

而且,正如上面的答案中所解釋的,日曆實例是通過調用Calendar類創建的。靜態工廠設計模式來創建日曆實例。

相關問題