我希望子类总是为某些方法调用super()。 如何在编译时强制执行或至少发出警告?
谢谢
答案 0 :(得分:9)
您可以稍微改变一下来强制执行此行为:
超类应该是抽象的,或者至少定义方法final。然后定义一个子类必须实现的受保护方法,最后让超类在完成任何需要事先运行的代码后调用该方法:
public abstract class SuperClass {
// final so it can't be overriden
public final void superMethod() {
// required code here
// then delegate to implMethod
implMethod();
}
protected abstract() void implMethod();
}
public class SubClasss extends SuperClass {
protected void implMethod() {
// sub class logic
}
}
当然,SuperClass不一定是抽象的,你可以实现implMethod然后允许子类覆盖它
答案 1 :(得分:2)
我认为Chris White的答案在一般情况下是最好的。但是chen ying的评论“我知道强制调用super是不好的。但我没有拥有超类。而SDK文档需要调用super。例如link”表示它不适合这个特定的实例。
因此,我建议修改克里斯怀特的答案以满足细节。
class ChenYingTestCase extends ServiceTestCase
{
/**
* Gets the current system context and stores it.
* You can not extend this method.
* If you want to achieve the effect of extending this method,
* you must override chenYingSetupMethod.
**/
public final void setUp ( )
{
super.setUp ( ) ;
chenYingSetup ( ) ;
}
/**
* Does nothing (unless you extend it)
*
* Extend this method to do your
* own test initialization. If you do so, there is no need to call super.setUp()
* Hint: calling super.setUp() is probably a bad idea.
* as the first statement in your override.
* Just put your test initialization here.
* The real SetUp method will call super.setUp() and then this method.
**/
protected void chenYingSetUp ( )
{
}
}
然后,如果子类在您的控制之下,则使其成为ChenYingTestCase的子类。如果子类不在你的控制之下,你就不能强迫它调用super()。
答案 2 :(得分:0)
如果基类具有默认(无参数)构造函数,则在没有给出明确的super()调用的情况下,它将始终自动调用。如果您可以控制基类,则可以将默认构造函数设为私有:
public abstract class Whatever {
private Whatever() {
// not visible to subclasses
}
public Whatever(A a, B b, ...) {
// this constructor must always be explicitly called by subclasses
}
}
除此之外,您的IDE可能允许您为此启用警告。它会出现在选项菜单中的某个位置。如果你没有看到它,那就不存在了。
答案 3 :(得分:0)
很长一段时间,东西变了。到现在(近9年后),您可以添加一个@CallSuper
批注,以确保覆盖该方法的任何类都必须调用super
。有关更多信息,请参见here。