两全其美了不是?
这就是减少创建对象技巧之一: 增加finer-grained辅助功能
第二种技巧是:Exploit mutability
上例还有一种实现方式:
public Rectangle getBounds(Rectangle returnVal) {
returnVal.x = myBounds.x;
returnVal.y = myBounds.y;
returnVal.height = myBounds.height;
returnVal.width = myBounds.width;
return returnVal;
}
多巧妙,把Rectangle作为参数传进来修改一下再送出去。
技巧3是 融合变和不变于一身。
总结上面一些例子,发现一个规律:临时对象产生是在这种情况下产生的: 不变的要转换成可变的。那么针对这个根本原因我们设计出各取所需的方案。
以下例说明:
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 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; } }
远程接口
在分布式应用中,性能也是相当重要的,这里介绍如何通过检查class的接口 能简单预知分布式应用中的性能问题。
在分布式应用中,一个在这个系统中运行的对象能够调用另外一个系统的对象的方法,这是通过很多 内部机制来实现将远程对象貌似本地对象的,为了发现远程对象,你首先必须发现它,这是通过一种名称目录服务机制,比如RMO的注册,JNDO和CORBA的名称服务。
当你通过目录服务得到一个远程的对象,你不是得到一个实际的指向,而是一个和远程行为一样的stub对象的 指向, 当你调用stub对象的一个方法时,这个得marshal这个方法参数:也就是转换成byte-stream,这类似于序列化,这个stub对象通过网络将marshal后的参数发送给skeleton对象,后者负责unmarshal这些参数然后 调用真正实际的你要调用的远程方法,然后,这个方法返回一个值给skeleton,再逐个沿着刚才路线返回, 一个简单方法要做这么多工作啊。
很显然,远程方法调用要比本地方法调用来得耗时昂贵。
上面返回情况是是指返回原始型primitive,如果返回的是对象,怎么办?如果这个对象支持 远程调用,它