Есть ли причина явно кодировать конструктор по умолчанию, когда нет других конструкторов? - PullRequest
13 голосов
/ 18 февраля 2010

Я недавно видел этот конструктор в классе:

public MyClass(){ }

Других конструкторов не было.

Есть ли причина для этого? Java автоматически создает конструктор по умолчанию, так зачем вам объявлять его явно? Или это считается хорошей практикой так же, как использование фигурных скобок для операторов с одним оператором - в случае, если позже добавляются другие конструкторы, и вы забываете, что по умолчанию у вас нет ...?

Ответы [ 8 ]

16 голосов
/ 18 февраля 2010

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

  • Это дает вам возможность установить точку останова.
  • Вы можете сделать это не публичным

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

Опять же, я не могу думать о каком-либо конкретном вреде в определении пустого ctor (хотя теперь, когда я это напечатал, у меня возникает ощущение, что кто-то может указать на какой-то уголок C ++, где он может вас укусить) .

6 голосов
/ 18 февраля 2010

Не играет никакой роли и может быть безопасно удалено.

3 голосов
/ 19 февраля 2010

Хотя ничего не получится, если явно добавить конструктор на техническом уровне, существуют потенциальные причины для этого. Во-первых, если экземпляр класса создается с помощью отражения, вы можете поместить некоторую документацию в конструктор по умолчанию, чтобы указать, что он требуется, даже если добавление нового конструктора не приведет к ошибке компиляции.

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

3 голосов
/ 18 февраля 2010

Вот что говорит Java Language Specification:

Если класс не содержит конструктора декларации, то по умолчанию конструктор, который не принимает параметров автоматически предоставляется:

  • Если объявленный класс является первичным классом Object, то Конструктор по умолчанию имеет пустое тело.
  • В противном случае конструктор по умолчанию не принимает параметров и просто вызывает конструктор суперкласса без аргументы.

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

IMO, вы должны делать это, только если вы хотите изменить уровень видимости вашего конструктора, то есть сделать его закрытым или защищенным пакетом

1 голос
/ 18 февраля 2010

Потому что вы верите во второе предложение дзен питона :

Явное лучше, чем неявное.

0 голосов
/ 29 июня 2015

На самом деле есть веская причина, чтобы включить его, не упомянутый в этих ответах:

Если существование конструктора без аргументов явно является частью контракта для вашего объекта, то это должно быть явно указано .

Если вы явно намереваетесь предоставить клиенту возможность подкласса кода, например, например, Java Swing - это хорошая идея явно сделать доступным конструктор без аргументов, даже если других конструкторов нет. В противном случае, если другой программист, по их мнению, решит создать другой конструктор, новый явный конструктор удалит неявный конструктор без аргументов и нарушит код клиента.

Если код подклассифицирован в вашей собственной кодовой базе, то это будет отображаться как ошибка компилятора, но если ваш код должен быть опубликован как jar, и субклассифицирован клиентом, ошибки компилятора не будет.

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

Цель хорошего кода - сделать так, чтобы другой разработчик как можно проще изменил его без ошибок!

0 голосов
/ 19 февраля 2010

Меня учили, что общедоступный конструктор по умолчанию требуется для спецификации java-компонента .. На странице википедии http://en.wikipedia.org/wiki/Java_Bean также перечислены его как требования.

С другой стороны, я заглянул на сайт Sun / Oracle и не смог найти упоминания об этом. Смотри http://java.sun.com/developer/onlineTraining/Beans/Beans1/simple-definition.html

0 голосов
/ 18 февраля 2010

Поправьте меня, если я ошибаюсь (я давно не занимался Java), но не мешает ли это вызову родительского конструктора? В этом случае очевидно, что родитель собирается сделать что-то автоматически, чего вы не хотите делать в этом классе.

...