不可變類的實(shí)例的狀態(tài)不會(huì)變化,這樣的實(shí)例可以安全的被其他與之關(guān)聯(lián)的對(duì)象共享,還可以安全的被多個(gè)線程共享。 為了節(jié)省內(nèi)存空間, 優(yōu)化程序的性能, 應(yīng)該盡可能的重用不可變類的實(shí)例,避免重復(fù)創(chuàng)建具有相同屬性值的不可變類的實(shí)例。
在 JDK1.5 的基本類庫(kù)中, 對(duì)一些不可變類, 如 Integer 類作了優(yōu)化, 它具有一個(gè)實(shí)例緩存,用來(lái)存放程序中經(jīng)常使用的 Integer 實(shí)例。JDK1.5 的 Integer 類新增了一個(gè)參數(shù)為 int 類型的靜態(tài)工廠方法 valueOf(int i),它的處理流程如下:
if(在實(shí)例緩存中存在取值為 i 的實(shí)例)
直接返回這個(gè)實(shí)例
else{
用 new 語(yǔ)句創(chuàng)建一個(gè)取值為 i 的 I nteger 實(shí)例
把這個(gè)實(shí)例存放在實(shí)例緩存中
返回這個(gè)實(shí)例
}
在以下程序代碼中,分別用 new 語(yǔ)句和 Integer 類的 valueOf(int i)方法來(lái)獲得 Integer 實(shí)例:
I nteger a=new I nteger(10);
I nteger b=new I nteger(10);
I nteger c=I nteger .valueOf(10);
I nteger d= I nteger .valueOf(10);
System.out.println(a==b); //打印 false
System.out.println(a==c); //打印 false
System.out.println(c==d); //打印 true
以上代碼共創(chuàng)建了三個(gè) Integer 對(duì)象,參見(jiàn)圖 11-4。每個(gè) new 語(yǔ)句都會(huì)創(chuàng)建一個(gè)新的Integer 對(duì)象。而 Integer .valueOf(10)方法僅僅在第一次被調(diào)用時(shí),創(chuàng)建取值為 10 的 Integer對(duì)象,第二次被調(diào)用時(shí),直接從實(shí)例緩存中獲得它。由此可見(jiàn),在程序中用 valueOf()靜態(tài)工廠方法獲得 Integer 對(duì)象,可以提高 Integer 對(duì)象的可重用性。
更多信息請(qǐng)查看IT技術(shù)專欄