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

}