В чем причина PMD CallSuperInConstructor?

PMD определяет правило CallSuperInConstructor. Какова цель добавления вызова без аргументов к super() в конструкторе, когда это не требуется компилятору?

Я понимаю, что могу отключить правило или использовать @SuppressWarnings, чтобы отключить правило в каждом классе.

Этот вопрос касается того, почему следует вызывать super(...) в конструкторе. Мой вопрос о том, зачем добавлять вызов super() без аргументов, когда компилятор этого не требует.


person Nathan    schedule 06.02.2019    source источник
comment
Короткий ответ: если вы расширяете что-либо, кроме Object, вы хотите дать своему родительскому объекту возможность выполнить какую-либо специальную инициализацию.   -  person JustinKSU    schedule 07.02.2019
comment
Возможный дубликат Зачем вызывать super() в конструкторе?   -  person JustinKSU    schedule 07.02.2019
comment
@JustinKSU Компилятор Java автоматически добавит вызов конструктору суперкласса, если в коде нет явного вызова, поэтому ваше объяснение не имеет смысла. Ваш дубликат также не отвечает на вопрос, почему PMD определяет это правило.   -  person Mark Rotteveel    schedule 08.02.2019
comment
Этот вопрос определенно не является дубликатом вопроса Зачем вызывать super() в конструкторе?   -  person Nathan    schedule 09.02.2019


Ответы (1)


Если ваш класс

  • имеет множество перегруженных конструкторов
  • расширяет класс, отличный от Object, который имеет множество перегруженных конструкторов

затем, когда вы явно вызываете super(), это позволяет избежать путаницы, какой конструктор класса/суперкласса вызывается.

Пример, иллюстрирующий вышесказанное:

class Foo {
    final int x;
    Foo(int x) {
        this.x = x;
    }
    Foo() {
        this.x = 1;
    }
}

class Bar extends Foo {
    Bar(int x) {
    }
}

Вопрос - каково значение new Bar(10).x?

person Adam Siemion    schedule 06.02.2019