可变性的利用
除了在组件中添加象上面讨论的getX()等具有简单数据类型值的临时函数外,Java 2还使用了其他的技术来减少在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 1.3类库中的java.math.BigInteger类中,一个类无需创建新的对象就返回一个"只读的"对象。MutableBigInteger类不是公开的,它只供java.math类库内部使用。但由于BigInteger类中的一些方法(例如gcd())是由许多的算术操作组成的,完成这些操作而无需创建临时对象将极大地改善程序的性能。
文章来源于领测软件测试网 https://www.ltesting.net/