首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Effective Java 項目 3:以私有建構子或枚舉型別強化 Singleton 特性

     編輯:Java 相關知識

Singleton 模式三種實作方式

Singleton 僅允許存在單一實例,常用於代表系統中本質上唯一的組件。主要有三種實作途徑:

  1. 公有靜態 final 欄位 + 私有建構子
  2. 靜態工廠方法 + 私有建構子
  3. 單元素枚舉型別(推薦)

方式一:公有靜態 final 欄位

public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1() { }
}

優點:API 明確表明該類別為 Singleton。缺點:無法靈活控制實例化時機,且難以防禦反射攻擊。

方式二:靜態工廠方法

public class Singleton2 {
    private static final Singleton2 INSTANCE = new Singleton2();
    private Singleton2() { }
    public static Singleton2 getInstance() { return INSTANCE; }
}

此方式允許延遲初始化,並可在工廠方法中加入防禦邏輯(如阻擋反射創建第二個實例)。但需額外處理序列化問題:實作 Serializable 並提供 readResolve 方法,否則反序列化會產生新實例。

protected Object readResolve() { return INSTANCE; }

方式三:單元素枚舉型別(最佳選擇)

public enum Singleton3 {
    INSTANCE;
    public void testSingleton() { System.out.println("testSingleton"); }
}

優勢:

  • 語法簡潔,天然防禦反射與序列化攻擊。
  • 無償提供序列化機制,保證絕對單一實例。
  • JVM 保證初始化執行緒安全。

除非必須繼承非 enum 的父類別,否則應優先採用枚舉實作 Singleton。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved