2011-06-24 8 views
3

私は、Parentクラスで宣言されているAnnotationを必要とする子Classを持っています。これを行う最善の方法は何ですか?メンバーこのようサブクラスのアノテーションを削除しますか?

public class Child extends Parent { 

String foobar; 

} 

を「上書き」である私は避けたい

public class Parent 

@MyAnnoation 
String foobar; 

} 


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

} 

は、それが「カバー」として下層親メンバーが= this.foobarがスーパーに異なる場合があります(いくつかの欠点があります.foobar)...

1.)サブクラス(ここではチャイルド)の親クラスからアノテーションを削除する簡単な方法はありますか?

2.)サブクラスで注釈を削除する正式な方法は何ですか?

ありがとうございました! Markus

+1

なぜあなたはそれをしたいですか? –

+1

このようなことをしたいのであれば、あなたのデザインをもう一度見てください。私は、実行時の注釈を削除する方法が推奨されていない場合には、それが可能だと思います。 – Simeon

+0

@SurajChandranあなたの質問は、 "なぜメソッドをオーバーライドしたいですか?" Answer:まあ、それはオブジェクト指向プログラミングについてです。スーパークラスで何かを指定し、サブクラスでそれを変更します。 – bvdb

答えて

2

このようなことをしたい場合は、おそらくデザインをもう一度見てください。

ランタイムアノテーションを削除する方法があれば、それは推奨されない方法だと思うのですが、クラス定義の一部を削除するためです。たとえば、メンバーのアクセス修飾子を削除するなどです。

これは、他のコードがこれらの定義に依存して実行時の決定を下す可能性があるため、予期しない結果をロジックに与える可能性があります。

ランタイム中にクラス定義を変更する必要がある場合は、このクラスを最初にそのような方法で定義する必要はありません。

+2

+1 - クラスが "is a"ではなく "bit like"であるために拡張しています。間違っています。 – Qwerky

+0

親クラスが '@ Nullable'メソッドを定義し、それをオーバーライドした後、そのメソッドはもはやnullableではないので、そのアノテーションを削除できないはずですか? :)私は、それほど納得がいくように聞こえるとは思いませんか? - いいえ、Nullableは実行時のものではありませんが、メソッドをオーバーライドするとMeta DOESのすべての注釈(メタ)に適用されると思います。 – bvdb

+0

@bvdbあなたは子供のフィールドが同じフィールドであり、nullでもかまいませんか?私たちが家を持っていて、家が屋根なしの家でない場合、屋根はヌル可能ではありません。私は家の家の継承者を考えることはできませんが、屋根はありません。 – Simeon

1

私の知る限り、注釈は削除できません。しかし、これは役に立ちます:

  1. 実行時にすべての注釈が利用できるわけではありません。その場合、明らかにそれらを削除する理由はありません。実行時に@Retention(RUNTIME)の注釈しか使用できません。 (例:@Nullable注釈は実行時には利用できませんが、@XmlElementです)。

  2. クラスレベルの注釈の場合のみ、考慮する必要があります。すべての注釈が自動的に子クラスに継承されるわけではありません。これは、独自の注釈が@Inheritedの注釈の場合のみです。

  3. 一部の注釈は、別の注釈を再宣言することによって矛盾することがあります。 (例えば@XmlAccessorType(FIELD)と親クラスが@XmlAccessorType(PUBLIC)と子クラスを持つことができます。)

をので、削除は不可能ですが、交換/再定義することです。 実際には、一部の注釈の効果を、デフォルト値@MyAnnotation(NONE)または@MyAnnotation(DEFAULT)または@NotMyAnnotationに設定することによって、「削除」することができます。これは、実際にあなたが扱っている注釈の種類に依存することを意味します。

もう1つ:子クラスのアノテーションを再定義することはできますが、依然として望ましい効果が得られるわけではありません。 (例えば、@XmlElementの場合には、親メソッドの注釈が実行中に優先度を有することがある)。いくつかのフレームワーク(例:永続性)は、Javaクラスアノテーションの代替として代替のXMLバインディングファイルをサポートします)。

関連する問題