警告开发人员在java中调用`super.foo()`

时间:2013-10-12 05:45:01

标签: java reflection

假设我有这两个类,一个扩展另一个

public class Bar{

    public void foo(){

    }

}

public class FooBar extends Bar {

    @Override
    public void foo(){
        super.foo(); //<-- Line in question
    }

}

我想要做的是警告用户调用超类的方法foo如果他们没有使用覆盖方法,这可能吗?

或者有没有办法知道,使用反射,如果我将类类型传递给super,那么覆盖其超类方法的方法会调用原始方法?

例如:

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();
    }

}

甚至可以在super方法上添加一个注释,因此它表明需要调用它?


修改

注意,它不是需要调用foo方法的超类,而是调用子类的foo方法的人,例如数据库close方法

我甚至会很高兴让这个方法“不可覆盖”,如果归结为它,但仍然希望给它一个自定义消息。


修改2

这就是我想要的方式:

enter image description here

但是拥有上述内容仍然很好,甚至可以给他们一个自定义消息来做其他事情,例如Cannot override the final method from Bar, please call it from your implementation of the method instead

2 个答案:

答案 0 :(得分:4)

编辑:回答编辑过的问题,其中包括:

  

我甚至会对使该方法“不可覆盖”

感到高兴

...只需制作方法final。这将阻止子类覆盖它。来自section 8.4.3.3 of the JLS

  

可以声明一个方法final,以防止子类覆盖或隐藏它。

     

尝试覆盖或隐藏final方法是编译时错误。

要回答原始问题,请考虑改为使用template method pattern

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实现最终,并引入一个新的受保护的抽象方法。

答案 1 :(得分:0)

你能做的就是跟着

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'成为子类不能覆盖并避免强制执行的东西