警告开发人员在java中调用`super.foo()`
可以说我有这两类,一类延伸到另一类
public class Bar{
public void foo(){
}
}
public class FooBar extends Bar {
@Override
public void foo(){
super.foo(); //<-- Line in question
}
}
我想要做的是警告用户调用超类的方法foo
如果它们没有在覆盖方法中,这是可能的吗?
或者有什么方法可以知道,使用反射,如果我将类类传递给超类,那么覆盖其超类方法的方法会调用原始方法?
例如:
public abstract class Bar{
public Bar(Class<? extends Bar> cls){
Object instance = getInstance();
if (!instance.getClass().equals(cls)) {
throw new EntityException("The instance given does not match the class given.");
}
//Find the method here if it has been overriden then throw an exception
//If the super method isn't being called in that method
}
public abstract Object getInstance();
public void foo(){
}
}
public class FooBar extends Bar {
public FooBar(){
super(FooBar.class);
}
@Override
public Object getInstance(){
return this;
}
@Override
public void foo(){
super.foo();
}
}
也许甚至可以将一个注释放在超级方法上,以显示它需要被调用?
编辑
请注意,它不是需要调用foo方法的超类,它将有人调用子类的foo方法,例如数据库close
方法
我甚至会很高兴让这种方法“不可重写”,如果它归结为它,但仍然想给它一个自定义的消息。
编辑2
这是我想要的方式:
但是,拥有上述内容仍然很好,甚至可以给他们一个自定义的消息来执行其他操作,比如, Cannot override the final method from Bar, please call it from your implementation of the method instead
编辑:要回答编辑的问题,其中包括:
我甚至会对使这种方法“不可覆盖”感到满意
...只是使方法final
。 这将防止子类重写它。 从JLS第8.4.3.3节:
一个方法可以被声明为final
以防止子类重写或隐藏它。
尝试覆盖或隐藏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() {
// ...
}
}
这并不强制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',所以子类不能重写和避免做强制性的东西
链接地址: http://www.djcxy.com/p/74873.html