2011-08-02 15 views
0

我使用2個庫,我需要從一個庫中的類來從其他功能。我的第一個嘗試是採取庫A的來源,並使類從庫B擴展類。這工作挺好,除了固定等很多不使代碼都穩定等,更新其中一個庫變成了一個地獄。性能/靈活性,例如一個類或擴展它

這樣的:

abstract class classA extends classB{ 
} 

現在我也想過做這樣的事情:

abstract class newClass extends classB{ 
    private classA A = new classA(); 

    public void exampleMethod(){ 
     A.exampleMethod(); 
    } 
} 

是第二個選項糟糕的表現明智?如果是,有多糟糕?

+0

有關移動'exampleMethod()''到什麼classB'?要解決這個問題,有一個更具體的例子會更容易。順便說一下,請檢查您的類和字段的命名重新編寫Java代碼約定 – powerMicha

+0

然後我會再次從庫中更改一個類,這是我想要擺脫的。在我個人的情況下,這意味着將兩個相當龐大的庫結合在一起,這些庫依賴於許多超類,這些庫也需要組合才能保留所有功能。 – Tim

回答

2

通過授權表單(mixin)的擴展在這裏有各種各樣的原因是可取的,但最相關的是你(可能)以非規範的方式擴展第三方庫類。我們有不知道你在說什麼庫。例如,它可能是一個寫得不好的圖書館,其中classA(使用你的例子)確實不應該擴展,但作者忽略了規範final class classA等。如果是這樣的話,那麼顯然你不想擴展該類(即使可以)。所有這些說法,考慮到你(a)只需要共享功能,(b)不需要多態語義,委託表單就非常有意義。

關於表現焦慮的建議:以此爲基準。

而且不要忽視最終 - JIT是你的朋友(是不錯的它,並給它):

final private classA A = new classA(); 
+0

雖然我同意最終做出'A'是個好主意,但我不明白這是如何影響JIT的。 –

+0

該決定應果斷地通知JIT,委託調用棧(引用)永遠不會改變,並且可以在沒有任何啓發式的情況下進行摺疊。 (但是,一旦它變暖了,我相信你是對的。) – alphazero