1. 程式人生 > >第4條:通過私有構造器強化不可例項化的能力

第4條:通過私有構造器強化不可例項化的能力

對只有靜態方法和域的類,主要用於把基本型別的值或資料型別上的相關方法組織起來(Math,Arrays),可以通過Collections的方法把實現特定介面的物件上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴充套件該類的做法。此工具類是不希望被例項化的,例項化對他麼有任何意義。然後我們如果不提供構造器,jvm會自己提供,那還是會被例項化,那麼我們只要在類中提供一個私有的構造器就可以了,並添加註釋說明。 這樣帶來的問題是不能子類化,因為子類要求要求super父類的建構函式。

場景:

在建立工具類的時候,大部分是無需例項化的,例項化對它們沒有意義。在這種情況下,建立的類,要確保它是不可以例項化的。

存在問題:
在建立不可例項化的類時,雖然沒有定義構造器。但是,客戶端在使用該類的時候,依然可以例項化它。客戶端,可以繼承該類,通過例項化其子類來實現例項化;客戶端可以呼叫預設的構造器來例項化該類。

要避免這個問題,使用的方式是,定義一個私有的構造器:

public class UtilityClass {
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

新增 throw new AssertionError(),是避免在UtilityClass例項化UtilityClass類。

因為有了私有的無參構造器,這樣客戶端就沒有辦法呼叫預設構造器來例項化該類;也避免了繼承的子類被例項化的問題。

相關推薦

4通過私有構造強化不可例項能力

對只有靜態方法和域的類,主要用於把基本型別的值或資料型別上的相關方法組織起來(Math,Arrays),可以通過Collections的方法把實現特定介面的物件上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴充套件該類的做法。此工具類

《Effective Java 中文版 2版》學習筆記 4通過私有構造強化不可實例能力

缺省 ive ont sof family 其他 筆記 cnblogs ror   只有當類不包含顯式的構造器時,編譯器才會生成一個公有的、無參的缺省構造器。只要讓一個類包含私有構造器,這個類就不能被實例化了。示例: 1 // 工具類 2 public class Uti

3私有構造或者列舉類型別強化Singleton屬性

一、公有final域靜態成員 //Singleton with public final field public class Elvis { public static final Elvi

3私有構造或者列舉型別強化Singleton屬性

術語: Singleton:指僅僅被例項化一次的類。         Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非它實現一個充當其型別的介面。         實現Singleton有以下三種方法: 1、實現公有靜態成員

EffectiveJava 3 私有構造或者列舉型別強化Singleton屬性

Singleton只不過是指僅僅例項化一次的類[Gamma95, p. 127]。Singleton通常被用來代表那些本質上唯一的系統元件,比如視窗管理器或者檔案系統。使類成為Singleton會使它的客戶端測試變得十分困難,因為無法給Singleton替換模擬實現,除非

Effective java私有構造或者列舉型別強化singleon屬性

單例模式大家都不模式,java1.5發行版之前大家都用兩種方法實現singleton。 第一種:靜態成員 public class Singleton1 { public static final Singleton1 INSTANCE =

讀書筆記-《Effective Java》34 強化Singleton屬性—私有構造或者列舉型別

第3條:用私有構造器或者列舉型別強化Singleton屬性 把構造器私有這個是單例基本要求,本條介紹了一種不知道為啥沒有流行起來的單例方式(實現Singleton的最佳方式),包含單個元素的列舉型別(INSTANCE不是關鍵字,寫別的也行) package org.test; p

Effective Java 三版讀書筆記——條款4使用私有構造來強制實現不可例項

偶爾你會想寫一個類,這個類只是一組靜態方法和靜態屬性。 這樣的類獲得了不好的名聲,因為有些人濫用這些類而避免以面向物件的方式思考,但是它們有時候確實有實際的用處: 它們可以被用來聚集一組建立在基礎型別或陣列之上的相關方法,例如 java.lang.Math 或 java.util

Effective Java 三版讀書筆記——條款3使用私有構造或列舉型別來強制實現 singleton 屬性

單例(singleton)就是一個只例項化一次的類。使類成為單例可能會使它的測試變得困難,因為除非它實現了作為其型別的介面,否則不可能用模擬實現來代替這個單例。下面是幾種實現單例的方法: 使用 public field 方法 // Singleton with public final field pub

Effective Java 三版讀書筆記——條款3使用私有構造來強制實現不可例項

偶爾你會想寫一個類,這個類只是一組靜態方法和靜態屬性。 這樣的類獲得了不好的名聲,因為有些人濫用這些類而避免以面向物件的方式思考,但是它們有時候確實有實際的用處: 它們可以被用來聚集一組建立在基礎型別或陣列之上的相關方法,例如 java.lang.Math

(3)私有構造或者列舉型別強化Singleton屬性

在java 1.5版本發行前實現單例一般有兩種方法 (1)靜態成員 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {

EffectiveJava----私有構造強化單例屬性之最優解決方案列舉

#私有建構函式強化singleton屬性 公有的靜態成員是一個final域,成員的宣告很清楚的表達了這個類是一個singleton。 public class Elvis { public static final Elvis INSTANCE = new Elv

1考慮採用靜態工廠方法代替構造

第1條:考慮採用靜態工廠方法代替構造器 對類而言,為了讓客戶端獲取它自身的一個例項,最常用的方法就是提供一個公有的構造器。還有一種應該被程式設計師重視的方法:類提供一個公有的靜態工廠方法(static factory method),它只是一個返回類的例項的靜態方法。下面是來自Boolean(基本型別boo

2遇到多個構造引數時要考慮用構造

一、靜態工廠和構造器有個共同的侷限性:它們都不能很好地擴充套件到大量的可選引數。 二、重疊構造器模式可行,但是當有許多引數的時候,客戶端程式碼會很難編寫,並且仍然較難以閱讀—— Demo: 三、遇

讀書筆記-《Effective Java》2遇到多個構造引數時要考慮用構建

當一個類有很多個屬性時,建立物件的時候要麼就先建立個物件然後給物件賦值,要麼就根據業務需要寫很多個構造器, 這樣的構造器可讀性差。就算用靜態工廠也得寫很多個,這時候就可以用構建器了。 例如: package org.test; public class People { pr

讀書筆記-《Effective Java》1考慮用靜態工廠方法代替構造

優勢 它們有名稱    構造器沒有名稱, 當一個類有多個構造器的時候就不容易分清楚哪個是自己想要的。 不必在每次呼叫它們的時候都建立一個新物件 如果新建立的物件的成員屬性是可以重用的, 那麼可以先把第一次建立的物件儲存起來,以後想用的時候就不用

Effective Java 學習 私有構造或者列舉型別強化Singleton屬性

綜述:Singleton即單例模式是指僅僅被例項化一次的類。比如工作管理員、檔案管理器、回收站、某些工具類等,這些類在程式中僅僅需要一個例項就足夠了,這個時候可以考慮使用單例模式。,以下介紹三種實現單例模式的方法: 1.餓漢式(類載入時建立例項) /** * Create

3 建立與銷燬物件——用私有構造或者列舉型別強化Singleton屬性

實現Singleton有以下三種方法。 1、將公有靜態成員做成final域: public class Elvis { public static final Elvis INSTANCE = newElvis(); private Elvis() {

EffectiveJava讀書筆記- 1考慮用靜態工廠方法代替構造

考慮靜態工廠方法代替構造器 靜態工廠方法相對於構造器的好處: 1. 靜態工廠方法有名字,相比構造器建立的物件更語義化 最好的例子就是併發庫中的Executors工具類了。 Executors中有多個建立執行緒池的方法: public static

3:用私有構造或者列舉型別強化Singleton屬性

Singleton指僅僅被例項化一次的類。 例如:檔案系統,資料庫連線,視窗管理器等 在Java 1.5之前,實現Singleton有兩種方法,這兩種方法都要把構造器保持為私有的,下面直接貼例項程式碼,應該都能看懂: 第一種: 需要獲取的公有靜態成員(需