2016-08-02 99 views
-1

前幾天看了一些Java代碼,我看到了一些我以前沒見過的東西,並且有些困惑。部分代碼如下所示:公共類與相同類的私有靜態變量

public class PreferredAlternateProxy { 
    ... 
    private static PreferredAlternateProxy instance; 
    ... 

    public static PreferredAlternateProxy getInstance(){ 
     if(instance == null) 
      createInstance(); 

     return instance; 
    } 

    private static synchronized void createInstance(){ 
     if(instance == null) 
      instance = new PreferredAlternateProxy(); 
    } 
} 

什麼是聲明的同一類的靜態屬性作爲公共類的目的是什麼?這在什麼情況下有用?

使第二個方法(createInstance())同步的目的是什麼?

+4

Google Singleton –

+0

'「使第二個方法(createInstance())同步的目的是什麼?」 - 所以可以懶惰地創建一個且只有一個實例。 –

+0

這段代碼是否完全脫離了上下文?或者是否有文件,評論或其他解釋? –

回答

1

有一些像設計模式告訴你如何有效地編寫代碼。你給的例子叫做Singleton。這種模式的目的是創建一個和該類的唯一一個實例。它需要一個:

  1. 私人構造函數(s) - 無法任何人創建類的實例。
  2. 私有靜態字段 - 將保留生成的實例在內存中。
  3. 公共靜態方法 - 即「守門員」,其作業是返回實例。

例子:

public class Singleton() { 
    private static Singleton instance; 

    private Singleton() { 

    } 

    public static Singleton getInstance() { 
     if (instance == null) { 
      instance = new Singleton(); 
     } 
     return instance; 
    } 
} 

上面的例子被稱爲延遲初始化,因爲沒有創建實例,直到您叫getInstance()首次。

下面的例子顯示了早期初始化,當類加載到內存中時它創建實例。

public class Singleton() { 
    private static Singleton instance = new Singleton(); 

    private Singleton() { 

    } 

    public static Singleton getInstance() { 
     return instance; 
    } 
} 
0

你在你的問題中的代碼是實現Java Singleton模式。

  • 示例中的PreferredAlternateProxy是靜態的,因此您只需要一個實例即可創建類 級變量。
  • 第二種方法是爲了使其線程安全,並且還降低了直接調用同步方法的成本。儘管我們只需要可能創建單獨實例的前幾個線程。它被稱爲雙重檢查鎖定原則。因此,如果創建實例,則不再調用同步方法。

希望這可以幫助您更好地理解它。

乾杯!