2012-05-08 48 views
1

我正在經歷一段代碼,當我遇到這個傳來:對象是否可以訪問修飾符?

public class ClassicA { 
    private static ClassicA instance = null; 
} 

我從來沒有使用過這樣的事情,想知道這意味着什麼,它是如何使用的。另外,對象的訪問修飾符的用途是什麼?任何示例/鏈接都歡迎。

+0

可能在類有一個靜態getter方法實例。 – BigMike

回答

4

這可能意味着ClassicA是一個Singleton。它通常涉及聲明一個私有構造函數,以及一個公共靜態方法getInstance()。當你要確保只有一個在整個應用程序的ClassicA全局實例

單身人士使用。您可以調用getInstance()來檢查它是否實例化了一次,而不是實例化它。如果是,它將實例化它,並將結果對象存儲在專用instance字段中。如果它已經構建好了,只需返回instance字段而不需要重新實例化。

請注意,這被認爲是不好的做法。見:https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

+0

嗯,嚴格地說,這並不意味着這個類是單身人士:可能有一個公共構造函數。我假設類源代碼不完整,否則它沒有多大意義。 – Vlad

+0

@ Vlad:增加了「可能」。謝謝。 –

+0

@Truth:謝謝,我因此刪除了我的評論:-) – noMAD

1

其一個singleton 基本上是作者的意圖那裏是隻有1本類的實例活着(實例字段) 構造可能是私有的,只能在類中使用。

+1

如果你在描述的位置寫下,而不是隻發佈一個鏈接,它通常會更有幫助。 –

+0

好的,+說明 – radai

1

這是類的(靜態)成員,是的,these can have access modifiers。 (正如其他人已經注意到的那樣,它確實看起來像一個Singleton的一部分。)

0

這是用於單身模式。見here

+4

我期望從一個10k用戶得到更好的答案。 –

+0

@Truth我只關心點:10k用戶。 – peeyush

+0

@Truth:那麼,如果工作要求,那麼SO必須等待。 –

3

那麼,類ClassicA有一個私人和靜態字段instance它是空的。 如果沒有獲取者/設置者,訪問該字段的唯一方法是使用反射。

由於這看起來像一個單身人士,我猜還有一個吸氣人,以及返回instance,如果它爲空,首先創建一個實例並將其分配給該字段。

0

private static意味着instance可用於該類的所有實例和靜態方法,但僅適用於它們。這實際上就像擁有靜態私有方法。

這種技巧可以用於例如用於實現單:你在內部保持一個類的一個實例,你可以把它給類的客戶需求。或者當你需要在靜態方法和某些類的實例之間共享某些東西時,也可以用於其他任何情況。

1

這通常用於展示Singleton design pattern的類。

問題是,對於這些類型的對象,最多隻需要一個實例。你所做的是爲類創建一個私有構造函數,然後通常使用一個名爲getInstance的公共靜態方法,在該方法中你檢查私有實例變量是否已被設置。如果它尚未設置,則創建該類的新實例並將其分配給實例,然後返回該實例。如果該對象已經創建,則只需返回它。像這樣:

public class MySingleton { 

    private static MySingleton instance=null; 
    private MySingleton() { 
    //do stuff 
    } 

    public static MySingleton getInstance() { 
    if (instance == null) { 
     instance = new MySingleton(); 

    } 
    return instance; 
    } 

} 

然後從整個程序中,你可以很容易地從任何地方獲得單身對象。

因此,一個單例實際上只是像PHP這樣的語言中的一個榮耀的全局變量。我認爲它會更清晰,因爲您可以防止其他人重新分配對實例的引用以及從設計角度來看可能非常糟糕的其他欺騙。

,通常人們將它用於管理一些類型的數據訪問,如DB對象,工廠類和建設者班班見this更多信息

+0

請注意比賽條件... – yshavit

+0

public syncrhonized?或者只是使用synchronized(MySingleton.class)?圍繞getInstance? –

+0

這將做到這一點(兩者基本相當),但它會增加一個同步瓶頸(這可能不是什麼大問題)。另一種方法是執行[雙重檢查鎖定](http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java) - 但請特別注意需要將「instance」設置爲「volatile」。但最好的方法可能不是延遲加載:'private static MySingleton instance = new MySingleton()'。該初始化程序本身是懶惰加載的(它只在加載類時運行,這是您第一次使用它時),它應該足夠好。 – yshavit