假设下面的代码片段:什么是在方法对象中包装静态方法调用的开销?
public class NotThatWellWrittenClass {
public static void doSmth() {
/*
This code part is actually irrelevant.
*/
}
}
其他一些类将使用UTIL如下:NotThatWellWrittenClass.do()
,所以唯一的开销实际上与performing a method call。
我真的不喜欢这种编程方式,所以我想重构这部分代码,而不是打破使用静态方法调用的客户端。重构代码片段:
public class NotThatWellWrittenClass {
public static void doSmth() {
new WorkUtil().doSmth();
}
}
public class WorkUtil() {
public void doSmth() {
/*
This code part is actually irrelevant.
*/
}
}
现在,代码更加面向对象,更容易测试和重用。然而,它现在确实创建了一个额外的对象(内存分配),并执行实例方法调用,而不是静态调用(我猜,它是通过不同的JVM优化的)。
所以,回到这个问题,下面的重构提供了明显的开销吗?也许它应该以其他方式执行? (我总是可以将一个实例缓存到我的对象,但这是否值得?)
我想深入解释一下,谢谢。
我从未注意到由此造成的任何开销。主要是因为在几乎每一段代码中都存在着更大的算法问题,不稳定的编码位和性能/ OO权衡。但是,如果您真的担心,请将您的方法和课程声明为“final”,这会给VM提示它不需要进行虚拟呼叫。 – biziclop 2012-03-05 10:50:58