假設下面的代碼片段:什麼是在方法對象中包裝靜態方法調用的開銷?
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