在应用程序中分析一些预先存在的第三方Java
代码(无法重写),我发现它几乎完全是在长方法链上构建的,形式为
public Object process() {
// Do some class-specific stuff
return this.getChild().process();
}
其中有一个定义process()
方法的基类,由重新定义该方法的子类继承,最后重复getChild()
调用。
在运行时由于条件块而创建(分支)多个这样的链,其中一些可能相对较早地返回(例如,在链中的10-20和#34;链接之后),但大多数通常"长度"在返回结果之前,链的数量要大得多,甚至可以超过100个连续的方法调用。
应用程序使用此代码处理大型文件,每次调用顶级方法时结果都会发生变化,通常每个文件的每个不同行一次。
所以,有两个问题:
答案 0 :(得分:2)
方法调用非常快(每秒10秒或100万),因此首先要通过分析系统来确保它真正有用。
否则,您可以使用缓存来提高效率,尤其是在结果一致的情况下(输入相同,输出相同)。
例如:
Object cache = null;
public Object process() {
if (cache == null)
cache = this.getChild().process();
return cache;
}
如果涉及某种输入或状态,则可以使用Map
作为缓存,该缓存使用输入值的键并存储输出值的值。
答案 1 :(得分:1)
表格声明
return getChild().process();
与
没有区别SomeType var = getChild();
return var.process();
在这两种情况下,一个方法将在另一个方法之后调用,getChild()
的返回值将用作process()
调用的接收方。
如果您正在寻找不相关的次要技术细节,则第一个表单不需要本地变量。但是因为在HotSpot中,在创建线程时预先分配了固定大小的堆栈内存,所以不可能察觉到这两种形式之间的任何差异。
这两种形式之间的选择纯粹是一种风格。