2017-09-14 90 views
2

我想創建跨許多類的通用功能。 所以我有2種方法。 1)創建一個新的類,並在其中有一個靜態方法。 2)創建一個新的接口,並在其中有一個具體的靜態方法。性能對類裝載VS Java接口中的接口加載的影響8

任何人都可以解釋這兩種方法在性能方面的差異嗎? 請考慮內存和處理的影響。

我應該選擇哪種方法,爲什麼?

+1

'創建一個新的方法,並在其中有一個具體的靜態方法?什麼? – Eugene

+0

我假設你的實際意思是「2)創建一個新的**接口**,並在其中有一個具體的靜態方法。」在這種情況下,沒有理由爲什麼應該有任何顯着的性能差異。 – Holger

+0

更正了這個問題。感謝尤金和霍爾格。 –

回答

1

表現明智,這應該不重要,這意味着即使它是,它會非常小,所以這不應該推動你的決定。

另一方面,定義一個接口與靜態方法,僅用於通用代碼是一個大代碼異味IMO。通常定義接口中的靜態方法,以便它們返回此接口的實例;我傾向於在他們看靜態工廠方法本身的通常回報的情況下,像Predicate#isEqual

static <T> Predicate<T> isEqual(Object targetRef) { 
    return (null == targetRef) 
      ? Objects::isNull 
      : object -> targetRef.equals(object); 
} 

另外一個接口的目的還是要延長,如果你寫裏面一個簡單的靜態方法,你有點違反了這條規則。

另一個問題是,當在接口中定義靜態方法時,擴展此接口的類不能使用該方法。例如與默認方法不同。所以,如果你有一個接口:

interface Test { 
    public static String test() { 
     return ""; 
    } 

    public default String testAgain() { 
     return ""; 
    } 
} 

和A類TestImpl擴展這個接口,比:

TestImpl ti = new TestImpl(); 
ti.testAgain(); 
ti.test(); // will not compile 

那麼可能是你可以使用默認的方法,而不是靜態的。我有時會贊成這樣做,因爲它使代碼更接近我需要的地方:如果某個類實現了一個帶有default method的接口 - 代碼就在那裏,我不需要使用外部類。

另一方面,靜態實用程序類遍佈整個jdk,例如Collections,StreamsSpliterators,如果我在你的鞋子裏,我會用它。