我想覆蓋第三方,開源最終類的非最終方法。Java擴展最終類
final class A
{
void put(obj a)
{...}
obj get()
{...}
}
請告訴我如何重寫get()
和put()
方法,但仍然保留這個類的其他行爲和功能。
我想覆蓋第三方,開源最終類的非最終方法。Java擴展最終類
final class A
{
void put(obj a)
{...}
obj get()
{...}
}
請告訴我如何重寫get()
和put()
方法,但仍然保留這個類的其他行爲和功能。
它是開源:叉它,使課堂非決賽。
你將不能夠給它沒有使它非最終延伸。
。什麼是叉子?複製並粘貼代碼,然後刪除「final」,然後重新編寫get和put方法? –
@Kevin:叉在「創建你自己的版本」。無論你是否公開發表,都是你自己的電話。你可以讓這個類不是最終的並且擴展它,或者可能只是自己改變'get' /'put'的行爲。當然,缺點是每次你想獲得一個新版本的庫時,你都必須再次進行更改...... –
這個選項是否優於封裝方法?如果是這樣,請告訴我爲什麼。我很好奇建築。 –
不能擴展final
類。按Java規範。
@Phlip:如果您需要重寫某些內容,請在設計層次結構中使用接口,而不是類。感謝喬恩, –
如果你的類在裏面放和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等。
你一定要試着找出爲什麼這個類是最終的。如果你能夠說服你自己可以這樣做,另一種選擇是使用AspectJ來改變這兩種方法的行爲。
AspectJ的允許你修改的具體方法的行爲。即使對於private
方法(安全約束允許)以及訪問和分配類的私有字段,它也可以這樣做。
簡短的回答是,你不能覆蓋的方法,因爲你不能擴展類。你打算怎樣通過重寫來獲取和放置方法?如果您正在尋找爲這些方法添加一些功能,您可以創建另一個包裝此類的類。
看看'A'是否實現了一些實際使用的接口。在這種情況下,您很幸運:您可以創建包含'A'作爲成員的'A1'並重新實現所有接口方法。 –