Как добавить предупреждение, что не вызывать super () в Java / eclipse - PullRequest
0 голосов
/ 23 марта 2012

Я ожидаю, что подкласс всегда вызывает super () для некоторого метода. Как я могу применить или хотя бы дать предупреждение во время компиляции?

Спасибо

Ответы [ 3 ]

9 голосов
/ 23 марта 2012

Вы могли бы спроектировать это немного по-другому, чтобы усилить поведение:

Суперкласс должен быть абстрактным или, по крайней мере, определять метод 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, а затем позволить подклассам переопределять его

2 голосов
/ 23 марта 2012

Я думаю, что Крис Уайт ответ лучше всего в общем случае. Но комментарий Чена Ина «Я знаю, что принудительно вызывать super не годится. Но я не владел суперклассом. А в документации SDK требуется вызывать super. Например, ссылка» предполагает, что он не подходит в данном конкретном случае.

Поэтому я бы предложил изменить ответ Криса Уайта, чтобы он соответствовал подробностям.

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 ().

0 голосов
/ 23 марта 2012

Если базовый класс имеет конструктор по умолчанию (без параметров), он всегда будет вызываться автоматически, если не указан явный вызов 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 может позволить вам включить предупреждение об этом.Это было бы где-то в меню параметров.Если вы этого не видите, его там нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...