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