1. 程式人生 > >【代碼優化】考慮使用靜態工廠方法取代構造器

【代碼優化】考慮使用靜態工廠方法取代構造器

ava tracking 什麽事 依據 mod true data -m span

靜態工廠方法與設計模式中的工廠方法模式不同,和設計模式中的工廠方法模式不直接相應。


使用靜態工廠方法比構造器的優勢


第一、靜態工廠方法是有名稱的,而構造器是通過參數推斷的。

每一個靜態工廠方法都有自己的名字,能夠依據名稱就能夠推斷它要做什麽事情,而構造器是做不到的。

如:構造器BigInteger(int,int),返回BigInteger能夠是素數,偶數等。而用名稱BigInteger。probalePrime的靜態工廠方法

就一目了然了,代碼easy閱讀。


第二、不必再每次調用時候都創建一個新的對象。

一個類預先構建一個實例。緩存起來。進行反復利用,避免不必要的反復對象。

實例的受控是的不可變類確保是一個Singleton或者是一個不可實例化的,使得不可變類能夠保證不會存在兩個相等的實例,

即a==b的時候才有a.equal(b)為TRUE。

若果保證了這點就能夠使用a==b取代a.equal(b),提升了性能。


第三、能夠返回原類型的不論什麽子類型的對象,這個都非常easy理解,


第四、創建參數化類型實例時,代碼更簡潔。

在java8之前,遺憾的是,在調用參數化類型構造器時。即使類型參數非常明顯,也必須指明。如:

Map<String> map=new HashMap<String>();

兩次指明泛型類型,要是泛型變的更復雜。就多寫了非常多代碼。

而使用靜態工廠方法的實現就簡潔非常多了:

public static<K,V> HashMap<K,V> newInstance() {

return newHashMap<K,V>();

}//這段代碼能夠復用

Map<K,V> map=HashMap.newInstance();


只是,什麽事情都不是完美的,靜態工廠方法也有它的缺點

1、類假設不含有公有的或者受保護的構造器,就不能被子類化。

也就是說。你不能把類的不論什麽方便的實現類子類化,這是不可能的。


2、它和靜態方法實際上沒有不論什麽差別。

因此,對於提供了靜態工廠方法而不是構造器的類來說,要想查明怎樣實例化一個類。是非常困難的。


總之,靜態工廠方法和公有構造器各有優勢,我們僅僅需了解他們的特性。各取所需,通常情況下,不要第一反應就提供

公有的構造器。最好還是考慮試試靜態工廠。



【代碼優化】考慮使用靜態工廠方法取代構造器