簡體   English   中英

調用靜態方法的實例

[英]Calling the instance of a static method

美好的一天!

我有點困惑。 我想使用日歷,所以我在互聯網上搜索它並遇到以下代碼:

Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);

但我了解到這是一種靜態方法:

Calendar.getlnstance();

如果調用的方法是靜態的,我怎么能得到日歷實例(抽象類)?

我真的很想了解它。 所以下次我還可以創建一個可以創建實例的靜態方法。

謝謝。

這是靜態工廠方法。 想法是方法是調用構造函數的方法,它返回構造的對象。 Calendar.getInstance()的主體可能是這樣的:

return new SomeCalendar(now);

SomeCalender抽象類 Calendar的具體實現。 一些優點是:您不必關心底層類(只要您知道它只是一個日歷),並且底層實現可以在不影響您的情況下進行更改(例如,可以更改代碼以return new AnotherCalendar() ,您不必更改代碼中的任何內容)

由於它是一個靜態方法,您可以在類型本身( Calendar.getInstance(); )上調用它,而不是該類型的實例( Calendar c = ...; c.getInstance(); )。

實例方法要求您已經有一個實例來調用該方法。

靜態並不意味着您不能將實例作為參數,作為結果返回實例或創建實例。 它只是意味着,該方法可以,而不必首先一個實例調用,並在該方法中有沒有這樣的東西this

您通常不希望這種工廠方法成為實例方法(非靜態),因為這意味着您需要已經有一個實例來創建一個新實例。 你會如何創建第一個?

(確實存在非靜態工廠方法,但它們更常用於創建不同類型的對象。例如,Builder或Factory類通常會有一個方法來創建其他類的實例。)

Java在所有地方都做了這種事情。 查看XML API。

這是一種將單個接口維護到Calendar系統的方法,即使底層實現已更改。 是的,該方法是一種工廠方法,但是,其他一些答案似乎錯過的一點是它可以返回Calendar不同實現。

即使它是抽象的,也可以返回Calendar。 getInstance()過度簡化實現可能是

Calendar getInstance()
{
    return new GregorianCalendar();
}

getInstance()的調用者不需要知道實現類型以獲取當前日期和時間。

我建議通過OpenJDK查看

工廠方法是靜態的這一事實並不能推斷Calendar是靜態的 - 它只是提供了一種創建Calendar的訪問機制。

看看這篇關於如何自己使用這個模式的帖子: http//today.java.net/pub/a/today/2005/03/09/factory.html

它還解釋了模式背后的原理。

我的第二個建議是閱讀有效的Java - 雖然它已經很老了,但這本書很棒!

它是在java中創建新對象的另一種方法。 傳統的構造函數是可行的方法,但由於使用靜態工廠有一些優點,因此它優於普通的vanilla構造函數。

你應該真的拿起Joshua Bloch的Effective Java。 這是本書的第一個項目。 優選靜態工廠用於構造。 他提到的優點是:

1_由於靜態工廠的名稱可以是描述性的。

2_然后可以返回任何子類型,而不僅僅是特定類的類型。

3_您可以在工廠方法中處理緩存和單例等概念。 (您不必盲目創建新對象)。

4_減少初始化代碼。 例如,我們可以使用類似getStringList()的方法來代替List newList = new ArrayList。

第四個優點是我不是很講究,但我看到Google Guava框架已經實現了它。請拿起這本書。 它是java最好的編程書籍之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM