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

前端之家收集整理的这篇文章主要介绍了警告开发人员在java中调用`super.foo()`前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有这两个类,一个扩展另一个类
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方法,例如数据库关闭方法

我甚至会很高兴让这个方法“不可重写”,如果它归结为它,但仍然想给它一个自定义的消息.

编辑2

这就是我想要的方式:

但是拥有上面的内容仍然很好,或者甚至给他们一个自定义消息来做其他事情,比如,不能覆盖Bar的最终方法,请从你的方法实现调用

解决方法

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

I would even be happy with making the method “un-overrideable”

…让方法最终.这将阻止子类覆盖它.从section 8.4.3.3 of the JLS开始:

A method can be declared final to prevent subclasses from overriding or hiding it.

It is a compile-time error to attempt to override or hide a final method.

要回答原始问题,请考虑使用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实现最终,并引入一个新的受保护的抽象方法.

猜你在找的Java相关文章