警告开发人员在java中调用'super.foo()'
假设我有两个类,一个扩展另一个警告开发人员在java中调用'super.foo()',java,reflection,Java,Reflection,假设我有两个类,一个扩展另一个 public class Bar{ public void foo(){ } } public class FooBar extends Bar { @Override public void foo(){ super.foo(); //<-- Line in question } } 也许我甚至可以在超级方法上添加注释,以显示需要调用它 编辑 注意,需要调用foo方法的不是超类,而是调
public class Bar{
public void foo(){
}
}
public class FooBar extends Bar {
@Override
public void foo(){
super.foo(); //<-- Line in question
}
}
也许我甚至可以在超级方法上添加注释,以显示需要调用它
编辑 注意,需要调用foo方法的不是超类,而是调用子类的foo方法的人,例如数据库
close
方法
如果归结起来,我甚至会很高兴将方法设置为“不可重写”,但仍然希望给它一个自定义消息
编辑2 在某种程度上,这就是我想要的:
但是,拥有上述功能还是很好的,甚至可以给他们一条自定义消息来执行其他操作,例如,
无法从Bar重写最终的方法,请从方法的实现中调用它,而不是
编辑:回答已编辑的问题,包括:
我甚至会很高兴让这个方法“不可重写”
。。。只需将方法设置为“最终”。这将防止子类重写它。发件人:
可以声明方法final
,以防止子类重写或隐藏它
试图重写或隐藏final
方法是编译时错误
为回答原问题,请考虑使用:
当然,这并不强制
FooBar
的子类重写fooImpl
并调用super.fooImpl()
,但是FooBar
可以通过再次应用相同的模式来实现这一点-使其自己的fooImpl
实现最终,并引入了一种新的受保护的抽象方法。您可以做如下操作
public class Bar{
public final void foo(){
//do mandatory stuff
customizeFoo();
}
public void customizeFoo(){
}
}
public class FooBar extends Bar {
@Override
public void customizeFoo(){
//do custom suff
}
}
foo方法在超类中设置了“final”,这样子类就不能重写和避免执行强制操作了这可以通过静态代码分析工具/规则检查器(例如IDEA)实现。如果你不能使用模板模式,FindBugs有一个检测缺失覆盖的注释:我甚至很乐意将方法设置为“不可覆盖”:这就是
final
的目的。我认为这样做是设计拙劣的问题。通常,如果需要的话,这些事情可以通过Javadoc处理。如果您想让用户调用db.close()方法,只需让用户在完成db的工作后单独调用它即可。@SmartLemon:是的,如果您完全更改了要求,final
确实可以……对不起,请查看第二次编辑,原始内容仍然是问题的一部分。
public abstract class Bar {
public foo() {
// Do unconditional things...
...
// Now subclass-specific things
fooImpl();
}
protected void fooImpl();
}
public class FooBar extends Bar {
@Override protected void fooImpl() {
// ...
}
}
public class Bar{
public final void foo(){
//do mandatory stuff
customizeFoo();
}
public void customizeFoo(){
}
}
public class FooBar extends Bar {
@Override
public void customizeFoo(){
//do custom suff
}
}