添加較小的輔助性函數
在最初版本的Swing工具包中
創建過多的Point
Rectangle和Dimension對象會嚴重地影響程序的性能
盡管一次在一個Point或Rectangle對象中返回多個值似乎更有效率
但這樣作的代價要比調用多個方法高得多
在最近的Swing版本推出之前
這個問題可以通過簡單地在組件或其他類中添加一些輔助性的方法得到改善
如下所示
public int getX() { return myBounds
x; }
public int getY() { return myBounds
y; }
public int getHeight() { return myBounds
height; }
public int getWidth() { return myBounds
width; }
現在
調用程序可以在不創建臨時對象的情況下得到同樣的結果
如下所示
int x = component
getX();
int y = component
getY();
int h = component
getHeight();
int w = component
getWidth();
原來的getBounds()仍然可以使用
較小的輔助性函數只不過提供了一種實現同樣目標的效率更高的方法
其結果是
Rectangle的接口將完全暴露在組件的接口中
當修改Swing使之支持並可以使用這些較小的輔助性函數後
其結果是
Swing中的許多操作的運行速度都比原來快了二倍
由於GUI代碼對性能比較敏感
這一改進的意義是重大的
這種技術帶來的負作用是對象擁有的方法更多了
而且要獲取同一種信息可以有多種方法
這就使文件變得相當大而且也更加復雜了
不利於用戶采用這一技術
但是
象Swing的例子顯示的那樣
在對性能要求比較高的情況下
這種優化技術還是十分有效的
可變性的利用
除了在組件中添加象上面討論的getX()等具有簡單數據類型值的臨時函數外
Java
還使用了其他的技術來減少在AWT和Swing中的對象創建活動
在組件和其他的GUI類中添加另一種版本的getBounds()
就可以在沒有創建臨時對象的前提上使調用程序得到象Rectangle類型的返回值
public Rectangle getBounds(Rectangle returnVal) {
returnVal
x = myBounds
x;
returnVal
y = myBounds
y;
returnVal
height = myBounds
height;
returnVal
width = myBounds
width;
return returnVal;
}
調用程序仍然必須創建一個Rectangle對象
不過
可以在以後的調用中重用它
如果一個調用程序反復調用許多Component對象
就可以創建一個Rectangle對象並在每個Component中使用它
需要注意的是
這一技術只適用於可變的對象類型
不可能通過這種方式減少創建String類對象
結合二家之長
一個更好的解決Point等簡單類的對象創建問題的方法是使得Point類成為不可變的
然後再定義一個可變的子類
具體方法如下面的例子所示
public class Point {
protected int x
y;
public Point(int x
int y) { this
x = x; this
y = y; }
public final int getX() { return x; }
public final int getY() { return y; }
}
public class MutablePoint extends Point {
public final void setX(int x) { this
x = x; }
public final void setY(int y) { this
y = y; }
}
public class Shape {
private MutablePoint myLocation;
public Shape(int x
int y) { myLocation = new MutablePoint(x
y); }
public Point getLocation() { return (Point) myLocation; }
}
在上面的例子中
Shape可以安全地返回myLocation的地址
因為調用程序如果試圖修改這些域或調用他們的
調節器
就會返回一個出錯信息
當然
調用程序仍然可以將Point轉換為MutablePoint
但很明顯這會帶來不安全性
雖然調用程序也會得到它們所需要的返回值
)C++的開發人員會注意到
這一技術與C++中的返回一個Rectangle的常量地址(const Rectangle&)有點類似━━Java不具備這樣的特性
在Java
類庫中的java
math
BigInteger類中
一個類無需創建新的對象就返回一個
只讀的
對象
MutableBigInteger類不是公開的
它只供java
math類庫內部使用
但由於BigInteger類中的一些方法(例如gcd())是由許多的算術操作組成的
完成這些操作而無需創建臨時對象將極大地改善程序的性能
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19787.html