title: Effective Java 3rd 讀書(shū)筆記(一)
date: 2019-02-19 18:05:09
tags: java
categories: 讀書(shū)筆記
才發(fā)現(xiàn) Effective Java 已經(jīng)出到第三版了,重新看一遍并且記錄下,這一篇先更靜態(tài)工廠方法
靜態(tài)工廠方法
使用靜態(tài)方法向外界提供自身實(shí)例的方法
Fragment fragment = MyFragment.newIntance();
// or
Calendar calendar = Calendar.getInstance();
使用靜態(tài)工廠代替構(gòu)造方法
在原生java中,有很多使用靜態(tài)工廠方法代替構(gòu)造方法的例子近尚,比如Boolean
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
使用靜態(tài)工廠有幾個(gè)優(yōu)點(diǎn):
可以使用名字去提示這個(gè)方法的返回
不使用new
去創(chuàng)建實(shí)例爵憎,通過(guò)靜態(tài)方法名字去代表不同創(chuàng)建實(shí)例的行為,例如valueOf
,newInstance
等鸳劳,這樣代碼的編寫(xiě)和閱讀都能夠更清晰狰贯。
允許在每次調(diào)用時(shí),不創(chuàng)建新的對(duì)象
例如Boolean
: Boolean.valueOf(boolean),永遠(yuǎn)不會(huì)返回新的對(duì)象赏廓。因此可以省去頻繁創(chuàng)建相同對(duì)象所造成的性能損耗涵紊,減少內(nèi)存占用;同時(shí)做到“控制實(shí)例”幔摸∶可以參考享元模式的思路。此外java中的單例模式也是使用靜態(tài)工廠方法既忆,具體寫(xiě)法參考單例模式的八種寫(xiě)法
可以返回該類(lèi)型的任何子類(lèi)
作為輸入?yún)?shù)的函數(shù)驱负,返回對(duì)象的類(lèi)可以隨調(diào)用的不同而變化。
例如EnumSet
類(lèi)沒(méi)有公共構(gòu)造函數(shù)患雇,只有靜態(tài)工廠跃脊。
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
//根據(jù)不同長(zhǎng)度,返回不同的子類(lèi)實(shí)例
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
當(dāng)編寫(xiě)包含方法的類(lèi)時(shí)苛吱,返回對(duì)象的類(lèi)不需要存在
考慮服務(wù)提供者框架(service provider frameworks)酪术,其包含提供者注冊(cè)API(提供者用來(lái)注冊(cè)實(shí)現(xiàn)),服務(wù)接口翠储,以及服務(wù)準(zhǔn)入API(客戶(hù)端用來(lái)獲取服務(wù)實(shí)例)绘雁,此外還有可選的第四個(gè)組件:服務(wù)提供接口橡疼,用于描述生成服務(wù)接口實(shí)例的工廠對(duì)象。在沒(méi)有服務(wù)提供者接口的情況下咧七,必須以反射的方式實(shí)例化實(shí)現(xiàn)
通過(guò)服務(wù)準(zhǔn)入API衰齐,客戶(hù)端可以通過(guò)定制標(biāo)準(zhǔn)來(lái)選擇不同的實(shí)現(xiàn)。參考JDBC
:Connection
=服務(wù)接口继阻;DriverManager.registerDriver
=提供者注冊(cè)API耻涛;DriverManager.getConnection
=服務(wù)準(zhǔn)入API
//TODO JDBC源碼分析
靜態(tài)工廠常用名稱(chēng)
- from: 一種型轉(zhuǎn)換方法,該方法接受單個(gè)參數(shù)并返回該類(lèi)型的相應(yīng)實(shí)例
- of: 一個(gè)聚合方法瘟檩,它接受多個(gè)參數(shù)并返回一個(gè)包含這些參數(shù)的此類(lèi)實(shí)例
- valueOf: 一種替代 from 和 of 但更冗長(zhǎng)的方法
例如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
- getInstance: 返回一個(gè)實(shí)例抹缕,該實(shí)例由其參數(shù)(如果有的話)描述,但不具有相同的值
- newInstance: 只是該方法保證每個(gè)調(diào)用都返回一個(gè)新實(shí)例
- get{Type}: 與
getInstance
類(lèi)似墨辛,但如果工廠方法位于不同的類(lèi)中卓研,則使用此方法。類(lèi)型是工廠方法返回的對(duì)象類(lèi)型 - newType: 與
newInstance
類(lèi)似睹簇,但是如果工廠方法在不同的類(lèi)中使用奏赘。類(lèi)型是工廠方法返回的對(duì)象類(lèi)型