《Effective Java》用私有構造器或者列舉型別強化SingleTon屬性
我們耳熟能詳的單例有懶漢式、餓漢式等
例如下面這段的餓漢式
用private修飾構造方法,防止外界通過無參的構造方法直接建立物件,但是這樣還是可以通過反射來攻擊,造成程式碼的不安全,可以考慮設定一個變數,在建立第二個物件的時候丟擲一個自定義的異常。
這樣就安全了嗎?
如果我將這個物件序列化到本地,然後再反序列化回來,這個物件還是原來的物件嗎?不是的,這時可以考慮使用序列化的hock函式readResolve()來解決,當反序列化時,就會自動呼叫這個 readResolve方法來返回我們指定好的物件,如下圖
還有一種非常簡潔的方式,通過列舉實現單例
Single就是要實現單例的類,通過SingeltonEnum.INSTANCE.getInstance()建立單例物件,列舉實際上是一種語法糖,反編譯後會發現是由靜態方法和匿名內部類組成。
總結:單例的實現有很多種,還有double-check,同步方法等方式實現,在這裡不一一贅述,在effective java中作者強烈推薦列舉來實現高效安全的單例,不會被反射和序列化攻擊所困擾。
相關推薦
effective java(3) 之用私有構造器或者列舉型別強化Singleton屬性
effective java 之用私有構造器或者列舉型別強化Singleton屬性 實現單例模式通常有3種方法(詳細請看設計模式單例模式一節)Singleton指僅僅被例項化一次的類。私有建構函式只能在函式內部呼叫,外部不能例項化,所以私有建構函式可以防止該類在外部被例項
Effective Java 學習 第三條 用私有構造器或者列舉型別強化Singleton屬性
綜述:Singleton即單例模式是指僅僅被例項化一次的類。比如工作管理員、檔案管理器、回收站、某些工具類等,這些類在程式中僅僅需要一個例項就足夠了,這個時候可以考慮使用單例模式。,以下介紹三種實現單例模式的方法: 1.餓漢式(類載入時建立例項) /** * Create
《Effective Java》用私有構造器或者列舉型別強化SingleTon屬性
我們耳熟能詳的單例有懶漢式、餓漢式等 例如下面這段的餓漢式 用private修飾構造方法,防止外界通過無參的構造方法直接建立物件,但是這樣還是可以通過反射來攻擊,造成程式碼的不安全,可以考慮設定一個變數,在建立第二個物件的時候丟擲一個自定義的異常。 這
第3條:用私有構造器或者列舉型別強化Singleton屬性
術語: Singleton:指僅僅被例項化一次的類。 Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非它實現一個充當其型別的介面。 實現Singleton有以下三種方法: 1、實現公有靜態成員
用私有構造器或者列舉型別強化Singleton屬性。
Singleton指僅僅被例項化一次的類。 Singleton通常被用來代表那些本質上唯一的系統元件,比如視窗管理器或者檔案系統。使類成為Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非它實現一
用私有構造器或者列舉型別強化Singleton屬性
在java1.5版本之前,實現Singleton有兩種方法。這兩種方法都要把構造器保持為私有的,並匯出公有的靜態成員,一遍允許客戶端能夠訪問該類的唯一例項。在第一種方法中,公有靜態成員是個final域: public class Elvis{ pu
(3):用私有構造器或者列舉型別強化Singleton屬性
在java 1.5版本發行前實現單例一般有兩種方法 (1)靜態成員 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {
第3條 建立與銷燬物件——用私有構造器或者列舉型別強化Singleton屬性
實現Singleton有以下三種方法。 1、將公有靜態成員做成final域: public class Elvis { public static final Elvis INSTANCE = newElvis(); private Elvis() {
EffectiveJava 第3條 :用私有構造器或者列舉型別強化Singleton屬性
Singleton只不過是指僅僅例項化一次的類[Gamma95, p. 127]。Singleton通常被用來代表那些本質上唯一的系統元件,比如視窗管理器或者檔案系統。使類成為Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非
第3條:用私有構造器或者列舉型別強化Singleton屬性
Singleton指僅僅被例項化一次的類。 例如:檔案系統,資料庫連線,視窗管理器等 在Java 1.5之前,實現Singleton有兩種方法,這兩種方法都要把構造器保持為私有的,下面直接貼例項程式碼,應該都能看懂: 第一種: 需要獲取的公有靜態成員(需
用私有構造器或者列舉型別強化Singleton屬性-03
術語: Singleton:指僅僅被例項化一次的類。 Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非它實現一個充當其型別的介面。 實現Singleton有以下三種方法:
3、用私有構造器或者列舉型別強化SIngleton屬性
結論 單元素的列舉型別已經成為實現Singleton的最佳方法 Singleton模式 常見的Singleton有兩種方式,第一種: public class Elvis { /
Effective java第三條:用私有構造器或者列舉型別強化singleon屬性
單例模式大家都不模式,java1.5發行版之前大家都用兩種方法實現singleton。 第一種:靜態成員 public class Singleton1 { public static final Singleton1 INSTANCE =
Effective Java 建立和銷燬物件 3.用私用構造器或者列舉型別強化Singleton屬性
Singleton 也就是常說的單例模式,只能被例項化一次,當然這看操作。 java1.5版本之前,實現Singleton有兩種方法。這兩種方法都要把構造器保持為私有的,並匯出公有的靜態成員,一遍允許客戶端能夠訪問該類的唯一例項。在第一種方法中,公有靜態成員是個final域
用私有構造器或列舉型別強化Singleton屬性
單例 Singleton 指僅僅被例項化一次的類,Singleton 通常被用來代表本質上唯一的系統元件 實現Singleton有兩種方法,兩種方法都要把構造器私有化 並匯出公有的靜態成員. 1. public class Elvis{ public static fi
讀書筆記-《Effective Java》第3條、第4條: 強化Singleton屬性—私有構造器或者列舉型別
第3條:用私有構造器或者列舉型別強化Singleton屬性 把構造器私有這個是單例基本要求,本條介紹了一種不知道為啥沒有流行起來的單例方式(實現Singleton的最佳方式),包含單個元素的列舉型別(INSTANCE不是關鍵字,寫別的也行) package org.test; p
第3條:用私有構造器或者列舉類型別強化Singleton屬性
一、公有final域靜態成員 //Singleton with public final field public class Elvis { public static final Elvi
Effective Java 第三版讀書筆記——條款3:使用私有構造器或列舉型別來強制實現 singleton 屬性
單例(singleton)就是一個只例項化一次的類。使類成為單例可能會使它的測試變得困難,因為除非它實現了作為其型別的介面,否則不可能用模擬實現來代替這個單例。下面是幾種實現單例的方法: 使用 public field 方法 // Singleton with public final field pub
使用私有構造方法或者列舉型別實現單例
單例(Singleton)是指只例項化一次的類。 單例表示本質上唯一的系統元件,例如檔案系統或者視窗管理器。 package com.googlecode.javatips4u.effectivejava.singleton; publicclass StaticFin
使用私有構造方法或枚類實現Singleton屬性
單例是一個僅例項化一次的類。單例物件通常表示無狀態物件,如函式或一個本質上唯一的系統元件。讓一個類成為單例會使測試它的客戶變得困難,因為除非實現一個作為它型別的介面,否則不可能用一個模擬實現替代單例。 有兩種常見的方法來實現單例。兩者都基於保持構造方法私有和匯出公共靜態成員