如何在Java / eclipse中添加不调用super()的警告

时间:2012-03-23 01:04:58

标签: java eclipse compiler-warnings

我希望子类总是为某些方法调用super()。 如何在编译时强制执行或至少发出警告?

谢谢

4 个答案:

答案 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