警告开发人员在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

上一篇: Warn developer to call `super.foo()` in java

下一篇: Form seq(text) binding