2011-06-24 48 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类注释的替代)。