2012-03-05 76 views
1

假設下面的代碼片段:什麼是在方法對象中包裝靜態方法調用的開銷?

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優化的)。

所以,回到這個問題,下面的重構提供了明顯的開銷嗎?也許它應該以其他方式執行? (我總是可以將一個實例緩存到我的對象,但這是否值得?)

我想深入解釋一下,謝謝。

+2

我從未注意到由此造成的任何開銷。主要是因爲在幾乎每一段代碼中都存在着更大的算法問題,不穩定的編碼位和性能/ OO權衡。但是,如果您真的擔心,請將您的方法和課程聲明爲「final」,這會給VM提示它不需要進行虛擬呼叫。 – biziclop 2012-03-05 10:50:58

回答

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(); 
    } 
} 
+0

那些靜態方法可能相當大,我不能對它們的複雜性作出任何假設。另外 - 由於它是靜態方法,我不能確定它不會以不好的方式被調用,例如每秒1k次。 我只是在尋求一般的方法,不管這個重構是否是一個好的做法。 – 2012-03-05 10:53:28

+0

@ŁukaszBachman您是否編碼圖書館或最終產品?如果它是最終產品,您可以完全控制它被調用的次數。此外,如果方法本身不僅僅是簡單的操作,任何開銷都會產生較小的影響。 – biziclop 2012-03-05 11:03:37

+0

最終產品,我知道我可以分析源代碼,看看它是如何被使用的,但是由於我是開發團隊的新手,我不能保證有人沒有在其他子項目中使用這種util方法。 – 2012-03-05 11:52:35

相關問題