优化JAVA机能的几种要领
添加较小的帮助性函数
在最初版本的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 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())是由很多的算术操纵构成的,完成这些操纵而无需建设姑且工具将极大地改进措施的机能。