由于不可變性通常與額外的對象創建聯系在一起━━這大部分原因都要"歸功"于其不可變性,許多編程人員就斷定不可變的對象一定會影響程序的性能。其實真實的情況要復雜得多,實際上,不可變性有時還能夠提升程序的性能,可變的對象也能夠引起程序性能的下降,可變性對程序性能的影響取決于其使用方式。
程序會經常對文本字符串進行操作和修改━━不可改變性確實是一個麻煩。在每次對String進行操作時━━例如查找或選擇一個前綴或子串,把它轉換為大寫或小寫,或者將二個字符串合并成一個新的字符串時,就必須創建一個新的String類對象。
另一方面,我們可以自由地共享一個不可變對象的地址而無需擔心對象會被改變,此時,不可變對象在性能上就比可變對象要好許多。
可變對象也存在臨時對象問題
在RegExpMatcher中,當一個方法返回的數據類型為String類時,就有必要創建一個新的String類對象。在BadRegExpMatcher中存在的問題之一是match()返回的是一個對象而不是一個簡單類型的數據━━因為一個方法返回一個對象,并不意味著一定會創建一個新的對象?紤]一下Point和Rectangle等java.awt中的幾何類,一個Rectangle只不過是由四個整數━━左上角點的X、Y坐標以及寬度和高度組成的,AWT組件類存儲了組件的位置并通過getBounds()方法將它作為一個Rectangle類對象返回:
public class Component {
...
public Rectangle getBounds();
}
在上面的例子中,getBounds()方法僅僅起一個輔助性作用,它只是聲明一些組件內部的有關信息。getBounds()真的必須創建它返回的Rectangle對象嗎?也許是這樣的吧,我們來看一下getBounds()的編碼:
public class Component {
...
protected Rectangle myBounds;
public Rectangle getBounds() { return myBounds; }
}
當有程序調用上面例子中的getBounds()時,并不會創建新的對象,因為組件已經知道它的位置,因此getBounds()是比較高效的。然而,Rectangle的可變性還引起了其他問題,當一個調用它的程序執行下面的代碼時會出現什么樣的情況呢?
Rectangle r = component.getBounds();
...
r.height *= 2;
文章來源于領測軟件測試網 http://www.kjueaiud.com/