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