我们假设以下代码片段:
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优化的。)
那么,回到这个问题,重构后是否提供了明显的开销?也许它应该以其他方式执行? (我总是可以将一个实例缓存到我的对象,但值得吗?)
我想得到一些深入的解释,谢谢。
答案 0 :(得分:0)
小的方法,例如35个字节长,可以内联。
只有经常调用的方法才会以这种方式进行优化。例如10,000次以上。
如果它很少被调用,那么无论如何它都需要几纳秒才重要。
如果WorkUtil.do()足够简单,可以优化对象分配。唯一的选择是自己回收物体。你真的需要这样做是非常罕见的。
public class NotThatWellWrittenClass {
private static final WorkUtil THE_WORK_UTIL = new WorkUtil();
public static void do() {
// could introduce thread safety issues as the object is now shared.
THE_WORK_UTIL.do();
}
}