程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Effective java學習筆記2:使用私有構造函數來強化單態性

Effective java學習筆記2:使用私有構造函數來強化單態性

編輯:JAVA編程入門知識

  單態性是什麼?這裡做一下簡單的介紹:
  Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。 在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。還有, singleton能夠被狀態化;
  這樣,多個單態類在一起就可以作為一個狀態倉庫一樣向外提供服務,比如,你要論壇中的帖子計數器,每次浏覽一次需要計數,單態類能否保持住這個計數,並且能synchronize的安全自動加1,假如你要把這個數字永久保存到數據庫,你可以在不修改單態接口的情況下方便的做到。
  另外方面,Singleton也能夠被無狀態化。提供工具性質的功能, Singleton模式就為我們提供了這樣實現的可能。使用Singleton的好處還在於可以節省內存,因為它限制了實例的個數,有利於Java垃圾回收(garbage collection)。我們經常看到工廠模式中類裝入器(class loader)中也用Singleton模式實現的,因為被裝入的類實際也屬於資源
  比較通用的兩種實現單態的方法:
  第一種:
  // Singleton with final field - page 10
  public class Elvis {
  public static final Elvis INSTANCE = new Elvis();
  
  private Elvis() {
  // ...
  }
  
  // ... // Remainder omitted
  
  public static void main(String[] args) {
  System.out.println(Elvis.INSTANCE);
  }
  }
  
  第二種:
  // Singleton with static factory
  public class Elvis {
  private static final Elvis INSTANCE = new Elvis();
  
  private Elvis() {
  // ...
  }
  
  public static Elvis getInstance() {
  return INSTANCE;
  }
  // ... // Remainder omitted
  public static void main(String[] args) {
  System.out.println(Elvis.INSTANCE);
  }
  }
  
  第一種方法顯而易見,靜態的public member Elvis.INSTANCE 永遠都指向同一個對象引用.所以,很輕易就保持了單態.
  第二種方法有更強的擴展性,不用更改api,你可以選擇使這個對象不成為單態的.比如:在不同的thread裡調用它,為每一個thread都生成一個獨立的instance.
  所以,假如你確定你的這個類永遠都是單態的,那麼就使用第一種方法.
  假如使用第二種方法,要確保單態,最好能夠為getinstance()加上synchronized 屬性.因為,假如沒有synchronized,在多線程裡面,有可能生成多個對象.
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved