Вы помещаете super () в начало ваших конструкторов? - PullRequest
7 голосов
/ 26 апреля 2010

Это вопрос о стиле кодирования и рекомендуемых методах:

Как объяснено в ответах на вопрос нет необходимости помещать super () в конструктор? , если вы пишете конструктор для класса, который должен использовать конструктор по умолчанию (no-arg) из суперкласс, вы можете вызвать super() в начале вашего конструктора:

public MyClass(int parm){
  super(); // leaving this out makes no difference
  // do stuff...
}

но вы также можете пропустить вызов; в обоих случаях компилятор будет действовать так, как если бы был вызов super ().

Итак, вы помещаете вызов в ваши конструкторы или нет?

С одной стороны, можно утверждать, что включение super() делает вещи более явными. OTOH, я всегда не люблю писать избыточный код, поэтому лично я склонен пропустить его; Однако я регулярно вижу это в коде других.

Каков ваш опыт? Были ли у вас проблемы с тем или иным подходом? Есть ли у вас правила кодирования, которые предписывают один подход?

Кстати: связанный вопрос (только для справки):

Есть ли причина явно кодировать конструктор по умолчанию, когда других конструкторов нет?

Ответы [ 9 ]

20 голосов
/ 26 апреля 2010

Я не пишу вызов super() по той же причине, по которой я не пишу ненужные приведения:

Добавляет шум в код, не предоставляя никакой дополнительной информации (ни компилятору , ни разработчику, читающему мой код).

4 голосов
/ 26 апреля 2010

Не знаю, но аргумент, который мне дали за то, что я делал это в университете, заключался в том, что это делает вещи более явными, поэтому вы не «забываете», что вызывается конструктор суперкласса.

Я просто не вижу в этом необходимости.

4 голосов
/ 26 апреля 2010

Стандартные настройки некоторых версий некоторых IDE генерируют его автоматически, поэтому это может быть одна из причин, по которой вы можете его видеть.

Писать это или нет, зависит от того, кто будет это читать. Я предпочитаю не добавлять его, но если вы не уверены, что члены команды понимают, что делает компилятор и как происходит построение объекта, вы можете добавить его «на всякий случай».

2 голосов
/ 26 апреля 2010

Я использую super() только тогда, когда конструктору super() нужны параметры.

2 голосов
/ 26 апреля 2010

Каков ваш опыт? Ты есть проблемы с одним или другим подходит?

Я никогда не вызывал конструктор по умолчанию (явный) и никогда не сталкивался с какими-либо проблемами

1 голос
/ 26 апреля 2010

Преимущество: Любой, кто читает ваш код, знает, что вы действительно хотите вызвать конструктор по умолчанию, вы не пропустили вызов по ошибке.

Недостаток: Вы загромождаете свой код неважной информацией.

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

1 голос
/ 26 апреля 2010

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

0 голосов
/ 26 апреля 2010

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

Если мне нужно наследовать от другого класса, я стараюсь оставить оба за собственным интерфейсом и передать один из них другому как зависимость.

Однако, если у меня есть класс lib, который я не могу дать дополнительной зависимости, первым делом я пытаюсь использовать декоратор.

Если это не сработает, и я должен извлечь из реализации, я думаю, что не имеет значения, писать ли super() или нет, так как это происходит так редко;

Итак, в общем, я думаю, что этот вопрос бессмыслен.

0 голосов
/ 26 апреля 2010

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

...