2011-06-24 85 views
3

我有一個孩子類,需要一個註釋,這是在父類中聲明被刪除。做這個的最好方式是什麼?刪除子類中的註釋?

public class Parent 

@MyAnnoation 
String foobar; 

} 


public class Child extends Parent { 
//here I only want to remove the @MyAnnotation from String foobar; 

} 

我想避免的是,「壓倒一切」的成員

public class Child extends Parent { 

String foobar; 

} 

,因爲這有幾個缺點(因爲它「包括」墊層父成員= this.foobar可以是不同的超.foobar)...

1.)有沒有簡單的方法從子類(此處爲Child)中的父類中移除註釋?

2.)在子類中刪除註釋的官方方式是什麼?

非常感謝! Markus

+1

你爲什麼想這樣做? –

+1

如果你想做這樣的事情比你可能應該再看看你的設計。我認爲如果有辦法刪除運行時註釋比不推薦:) – Simeon

+0

@SurajChandran你的問題是:「你爲什麼要重寫一個方法?」。答:好吧,因爲這就是面向對象編程的內容。你在一個超類中指定了一些東西,然後你在一個子類中修改它。 – bvdb

回答

2

如果你想做這樣的事情比你可能應該再看看你的設計。

我認爲如果有一種方法可以刪除運行時註釋而不是建議,因爲您將刪除類定義的一部分。就像刪除一個成員訪問修飾符一樣。

由於其他代碼可能依賴於這些定義來作出運行時決策,因此可能會在邏輯上產生意想不到的結果。

如果您需要在運行時修改類定義,那麼可能不應該首先以這種方式定義此類。

+2

+1 - 擴展是因爲一個類「有點像」而不是「是」是錯誤的。 – Qwerky

+0

因此,如果父類將方法定義爲'@ Nullable',並且在覆蓋它之後,該方法不再可以爲空,那麼您是否應該不能刪除該註釋? :)我的意思是,現在聽起來不那麼令人信服,不是嗎? - 好吧,Nullable不是一個運行時間的東西,但我認爲這適用於所有註釋(即元)Meta DOES改變,當你推翻方法。 – bvdb

+0

@bvdb你可以給出一個例子,其中一個孩子的字段是相同的字段,並且可以爲空?如果我們有房子,而房子不是沒有屋頂的房子,那麼屋頂不是空的。我無法想象一個房子的繼承人是房子,但沒有屋頂。 – Simeon

1

據我所知,你不能刪除註釋。但是這可能有所幫助:

  1. 不是所有的註釋在運行時都可用。所以,在這種情況下,顯然沒有理由將其刪除。運行時只能使用註釋@Retention(RUNTIME)。 (例如,@Nullable註釋在運行時不可用,但@XmlElement是。)。

  2. 僅適用於課程級別註釋,還有一件事需要考慮。並非所有註釋都會自動繼承到子類。這僅適用於具有其自己的註釋的註釋。

  3. 某些註釋可以通過重新標註不同的註釋來抵觸。 (例如,用@XmlAccessorType(FIELD)父類可以有@XmlAccessorType(PUBLIC)一個子類。)

所以,去除是不可能的,但重新定義/更換是。 實際上,這意味着某些註釋的效果可以通過將它們設置爲其默認值@MyAnnotation(NONE)@MyAnnotation(DEFAULT)@NotMyAnnotation來「移除」。所以,這意味着它真的取決於你正在處理的註釋類型。

還有一件事:即使您可以重新定義子類上的註釋,它仍然並不總是能達到預期的效果。 (例如,在@XmlElement的情況下,有時父方法上的註釋在執行期間仍然具有優先權)。很高興知道一些框架(例如,持久性)支持替代xml綁定文件作爲java類註釋的替代)。