2012-10-03 99 views
2

我想覆蓋第三方,開源最終類的非最終方法。Java擴展最終類

final class A 
{ 
    void put(obj a) 
    {...} 

    obj get() 
    {...} 
} 

請告訴我如何重寫get()put()方法,但仍然保留這個類的其他行爲和功能。

+0

看看'A'是否實現了一些實際使用的接口。在這種情況下,您很幸運:您可以創建包含'A'作爲成員的'A1'並重新實現所有接口方法。 –

回答

13

它是開源:叉它,使課堂非決賽。

你將不能夠給它沒有使它非最終延伸。

+0

。什麼是叉子?複製並粘貼代碼,然後刪除「final」,然後重新編寫get和put方法? –

+1

@Kevin:叉在「創建你自己的版本」。無論你是否公開發表,都是你自己的電話。你可以讓這個類不是最終的並且擴展它,或者可能只是自己改變'get' /'put'的行爲。當然,缺點是每次你想獲得一個新版本的庫時,你都必須再次進行更改...... –

+0

這個選項是否優於封裝方法?如果是這樣,請告訴我爲什麼。我很好奇建築。 –

1

不能擴展final類。按Java規範。

+0

@Phlip:如果您需要重寫某些內容,請在設計層次結構中使用接口,而不是類。感謝喬恩, –

4

如果你的類在裏面放和get方法的定義,然後你可能想嘗試代理類定義的接口。

最簡單的方法是創建這樣的:

public interface CommonInterface { 

void put(); Object get(); 

} 

final class A implements CommonInterface 
{ 

void put(obj a) 
{...} 
obj get() 
{...} 

} 

public class ProxyToA implements CommonInterface{ 

    private A a; 

    void put(Object a){ 
    // your override functionality 

    } 

    Object get(){ 
     // same here 
    } 

    void otherAStuff(){ 
     a.otherAStuff(); 
    } 

} 

,然後只用CommonInterface和代理的對象。或者你可以使用JDK代理,javassist等。

0

你一定要試着找出爲什麼這個類是最終的。如果你能夠說服你自己可以這樣做,另一種選擇是使用AspectJ來改變這兩種方法的行爲。

AspectJ的允許你修改的具體方法的行爲。即使對於private方法(安全約束允許)以及訪問和分配類的私有字段,它也可以這樣做。

0

簡短的回答是,你不能覆蓋的方法,因爲你不能擴展類。你打算怎樣通過重寫來獲取和放置方法?如果您正在尋找爲這些方法添加一些功能,您可以創建另一個包裝此類的類。