摘要:企圖通過將該類做成抽象類來強制該類不可被實例化,這是行不通的。這種習(xí)慣用法有點違背直覺,好像構(gòu)造器就是專門設(shè)計成不能被調(diào)用一樣。
??有時候你會想要編寫一個只包含一組靜態(tài)方法和靜態(tài)字段的類。這種類名聲很不好,因為有些人為了避免使用面向?qū)ο蟮乃季S方式而濫用這樣的類(some people abuse them to avoid thinking in terms of objects),但是他們確實有它們特有的用處。我們可以使用這種類,以java.lang.Math或者 java.util.Arrays的方式對原始值或數(shù)組的相關(guān)方法組織起來。它們還可以用于以java.util.Collections的方式,把實現(xiàn)特定接口的對象上的靜態(tài)方法(包括工廠:第1項)組織起來。(從Java 8開始,你也可以將這些方法放在接口中,假設(shè)它是你自己修改的)。最后,這些類可以用于對final類的方法組織起來,通過這種方式用以取代擴展該類的做法。
??這種工具類不希望被實例化,實例化對它沒有任何意義。然而,在沒有顯式構(gòu)造函數(shù)的情況下,編譯器會默認提供一個公共的、無參的默認構(gòu)造函數(shù)。對于用戶而言,這個構(gòu)造器與其他構(gòu)造器沒有任何區(qū)別。在已發(fā)行的API中常常可以看到一些被無意識地實例化的類。
??企圖通過將該類做成抽象類來強制該類不可被實例化,這是行不通的。該類可以被子類化,并且該子類也可以被實例化。這樣做甚至?xí)`導(dǎo)用戶,以為這種類是專門為了繼承而設(shè)計的(第19項)。然而,有一些簡單的習(xí)慣用法可以確保類不可被實例化。由于只有當類不包含顯示的構(gòu)造器時,編譯器才會生成缺省的構(gòu)造器,因此我們只要讓這個類包含私有構(gòu)造器,他就不能被實例化了:
// Noninstantiable utility class public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass(( { throw new AssertionError(); } ... // Remainder omitted }
??因為顯示構(gòu)造函數(shù)是私有的,所以它在類外是不可訪問的,AssertionError不是必需的,但是它可以避免不小心在類的內(nèi)部調(diào)用構(gòu)造器。它保證該類在任何情況下都不會實例化。這種習(xí)慣用法有點違背直覺,好像構(gòu)造器就是專門設(shè)計成不能被調(diào)用一樣。因此明智的做法就是在代碼中增加一條注釋,如上所示。
??這種習(xí)慣用法也有副作用,它使得一個類不能擁有子類。因為子類的所有構(gòu)造函數(shù)都必須顯示或者隱式地調(diào)用父類的構(gòu)造函數(shù),在這種情形下,子類就沒有可訪問的父類構(gòu)造器可用了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73937.html
摘要:一個類可以提供一個公共靜態(tài)工廠方法,它僅僅是一第項遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器靜態(tài)工廠和構(gòu)造器有個共同的局限性他們都不能很好地擴展到大量的可選參數(shù)。 ??本章涉及創(chuàng)建和銷毀對象,包括何時以及如何創(chuàng)建它們,何時以及如何避免創(chuàng)建它們,如何確保它們被及時銷毀,以及如何管理在銷毀之前必須進行的清理操作。 第1項:用靜態(tài)工廠方法代替構(gòu)造器 ??類允許客戶端獲取實例的傳統(tǒng)方法是提供公共構(gòu)造...
摘要:推薦序前言致謝第一章引言第二章創(chuàng)建和銷毀對象第項用靜態(tài)工廠方法代替構(gòu)造器第項遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器第項用私有構(gòu)造器或者枚舉類型強化屬性第項通過私有構(gòu)造器強化不可實例化的能力第項優(yōu)先考慮依賴注入來引用資源第項避免創(chuàng)建不必要的對象 推薦序 前言 致謝 第一章 引言 第二章 創(chuàng)建和銷毀對象 第1項:用靜態(tài)工廠方法代替構(gòu)造器 第2項:遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器 第...
摘要:本章中的大部分內(nèi)容適用于構(gòu)造函數(shù)和方法。第項其他方法優(yōu)先于序列化第項謹慎地實現(xiàn)接口第項考慮使用自定義的序列化形式第項保護性地編寫方法第項對于實例控制,枚舉類型優(yōu)先于第項考慮用序列化代理代替序列化實例附錄與第版中項目的對應(yīng)關(guān)系參考文獻 effective-java-third-edition 介紹 Effective Java 第三版全文翻譯,純屬個人業(yè)余翻譯,不合理的地方,望指正,感激...
摘要:兩者都基于保持構(gòu)造函數(shù)私有并導(dǎo)出公共靜態(tài)成員以提供對唯一實例的訪問。在一種方法中,該成員是字段私有構(gòu)造器只調(diào)用一次,用來初始化靜態(tài)變量。由于缺少或者屬性的構(gòu)造器,這就保證了的全局一致性一旦類被實例化,只會存在一個實例,不多也不少。 ??Singleton指僅僅被實例化一次的類 [Gamma95]。Singleton通常代表無狀態(tài)的對象,例如函數(shù)(第24項)或者本質(zhì)上唯一的系統(tǒng)組件。使類...
摘要:第二章創(chuàng)建和銷毀對象何時以及如何創(chuàng)建對象,何時以及如何避免創(chuàng)建對象,如何確保他們能夠適時地銷毀,以及如何管理對象銷毀之前必須進行的各種清理動作。表示工廠方法所返回的對象類型。 第二章 創(chuàng)建和銷毀對象 何時以及如何創(chuàng)建對象,何時以及如何避免創(chuàng)建對象,如何確保他們能夠適時地銷毀,以及如何管理對象銷毀之前必須進行的各種清理動作。 1 考慮用靜態(tài)工廠方法代替構(gòu)造器 一般在某處獲取一個類的實例最...
閱讀 3611·2023-04-26 02:10
閱讀 1397·2021-11-22 15:25
閱讀 1702·2021-09-22 10:02
閱讀 945·2021-09-06 15:02
閱讀 3505·2019-08-30 15:55
閱讀 635·2019-08-30 13:58
閱讀 2807·2019-08-30 12:53
閱讀 3092·2019-08-29 12:38