Это - вопрос о стиле кодирования и методических рекомендациях:
Как объяснено в ответах на вопрос, ненужный для помещения супер () в конструкторе?, если Вы пишете конструктору для класса, который, как предполагается, использует конструктора (без аргументов) по умолчанию от суперкласса, можно звонить super()
в начале Вашего конструктора:
public MyClass(int parm){
super(); // leaving this out makes no difference
// do stuff...
}
но можно также опустить вызов; компилятор будет в обоих случаях действовать, как будто супер () вызов были там.
Таким образом Вы помещаете вызов в своих конструкторов или нет?
С одной стороны, можно было бы обсудить тот включая super()
делает вещи более явными. OTOH, мне всегда не нравится писать избыточный код, так лично я склонен пропускать его; я действительно однако регулярно вижу его в коде от других.
Каковы Ваши события? У Вас были проблемы с одной или другим подходом? У Вас есть инструкции по кодированию, которые предписывают один подход?
BTW: связанный вопрос (только для ссылки):
Я не пишу вызов super ()
по той же причине, по которой я не пишу ненужные преобразования:
Он добавляет шум в код, не предоставляя никакой дополнительной информации (ни для компилятора и разработчику, читающему мой код).
Я не знаю, но аргумент, который я приводил в пользу этого, когда я учился в университете, заключался в том, что это делает вещи более явными, поэтому вы не «забываете», что вызывается конструктор суперкласса.
Я просто не вижу в этом необходимости.
Каковы ваши впечатления? Были ли у вас проблемы с тем или иным подходом?
Я никогда не вызывал конструктор по умолчанию (явный) и никогда не сталкивался с какими-либо проблемами
Настройки по умолчанию для некоторых версий некоторых IDE генерируют его автоматически, так что это одна из причин, по которой вы его можете увидеть.
Писать это или нет, зависит от того, кто будет его читать. Я предпочитаю не добавлять его, но если вы не уверены, что члены команды понимают, что делает компилятор и как происходит построение объекта, вы можете добавить это «на всякий случай».
Преимущество: Любой, кто читает ваш код, знает, что вы действительно хотите вызвать конструктор по умолчанию, вы не оставили вызов по ошибке.
Недостаток: Вы загромождаете свой код неважной информацией.
Обычно, если язык позволяет вам опустить какую-либо инструкцию, это неплохо. Я думаю, что это вопрос взвешивания плюсов и минусов. Например, явная запись super ()
, когда ваш конструктор имеет параметры, а базовый класс также имеет параметризованные конструкторы, может быть хорошей идеей.
Я стараюсь избегать написания кода, в котором вызывается super () необходимо, потому что я предпочитаю композицию наследованию.
Если мне нужно унаследовать от другого класса, я стараюсь разместить оба за собственным интерфейсом и передать один из них другому в качестве зависимости.
Если у меня есть класс lib, который я не могу дать дополнительной зависимости, первое, что я пробую, - это использовать декоратор.
Если это не сработает, и мне придется исходить из реализации, я думаю, не имеет значения, писать super ()
или нет, поскольку это случается очень редко;)
В общем, я считаю этот вопрос бессмысленным.
Я использую super ()
только тогда, когда конструктору super ()
требуются параметры.
На самом деле я использовал вызов super ()
, так как считаю его полезным помощником по запоминанию. Когда несколько месяцев назад я написал фрагмент кода и вернулся к нему, super ()
напоминает мне, когда я смотрю на конструктор, который класс, который я написал, наследуется от чего-то.
Я никогда не добавляю его, и я был глубоко шокирован, когда коллега не понял, что суперклассу был сделан неявный вызов, поэтому, возможно, мне стоит начать делаю это.