Конструктор по умолчанию это добро или зло? Checkstyle и PMD здесь противоположны - PullRequest
12 голосов
/ 26 октября 2010

Checkstyle говорит:

Class should define a constructor.

PMD говорит:

Avoid unnecessary constructors - the compiler will generate these for you.

Кто прав?Или, скажем так: в чем плюсы и минусы наличия пустого ctor по умолчанию в классе?

Ответы [ 8 ]

15 голосов
/ 26 октября 2010

Мне нравится ответ PMD.Чем меньше кода, тем лучше.Не пишите конструкторы, которые компилятор напишет для вас.

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

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

8 голосов
/ 26 октября 2010

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

6 голосов
/ 26 октября 2010

Когда конструктор по умолчанию является единственным конструктором, это на 100% эквивалентно написать его явно с пустым телом или опустить его.Однако компилятор не будет генерировать конструктор по умолчанию, если у вас есть явно определенные конструкторы, по умолчанию или нет.Это означает, что если вы полагаетесь на компилятор, который сгенерирует для вас конструктор, а затем добавите альтернативные конструкторы, то конструктор по умолчанию исчезнет.Лично я бы все равно позволил компилятору делать генерацию;если этот конструктор по умолчанию использовался, он генерирует предупреждения компиляции и его легко добавить в этот момент.Иначе зачем вообще его держать?

1 голос
/ 26 октября 2010

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

Затем, когда вы добавляете конкретный конструктор, код может перестать компилироваться - или, что еще хуже, код не будет выполняться (может быть отражательная зависимость от конструктора без параметров - большинство инструментов ORM требуют наличия конструктора по умолчанию для постоянных сущностей ).

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

1 голос
/ 26 октября 2010

IMO Class should define a constructor, поскольку, если вы полагаетесь на конструкторы по умолчанию, переменные экземпляра будут иметь значения по умолчанию (например, ноль для целых чисел, ноль для строки и т. Д.).Если вы хотите установить переменные экземпляра в какое-то значение по умолчанию всякий раз, когда создается объект для этого класса, определяющий конструктор самостоятельно, в этом случае может быть хорошим выбором.(При условии, что вы не хотите использовать методы getter и setter)

class Cube {
   private int length;
   private int breadth;
   private int height;

  public Cube() {
      length = 10;
      breadth = 10;
      height = 10;
  }
     ......
     ......
}

Теперь, когда вы создаете объект класса Cube1, для всех переменных экземпляра этого объекта будет установлено значение 10. Если вы неЗдесь не используется конструктор. Ваши переменные экземпляра (длина, ширина и высота) будут иметь значения по умолчанию (в данном случае ноль).


Отредактировано: [Добавлена ​​еще одна вещь]

Если вы полагаетесь на то, что компилятор сгенерирует для вас конструктор по умолчанию, и вы хотите использовать некоторые конструкторы, которые принимают аргументы / аргументы от пользователя, то вы должны определить конструктор по умолчанию, иначе компилятор выдаст ошибку.1012 * Помните : Компилятор создает конструктор по умолчанию для вашего класса, только если этот класс не содержит никаких других конструкторов.

1 голос
/ 26 октября 2010

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

Другое дело, что некоторые классы должны иметь согласованное состояние.Например, у вас есть класс Book.Нет смысла создавать книгу без заголовка, поэтому необходимо указать конструктор со строковым параметром:

public Book(String name) {
    this.name = name;
}

Что касается конструкторов по умолчанию, они могут быть необходимы, если вы должны сериализовать свой класс или использовать его.в marshalling / unmarshalling (JAXB требует пустой конструктор по умолчанию).

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

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

Также, если ваш класс довольно длинный, вы можете рассмотреть объявление пустымконструктор по умолчанию для повышения читабельности.

1 голос
/ 26 октября 2010

Я пойду с Checkstyle. Без явного (noarg) конструктора никто не узнает, предназначен он или нет.

Рассмотрим этот служебный класс:

public class Util {
    // no constructor given - implicit default constructor
    // intended? probably not, but who knows

    public static void foo() {
      // blabla
    }

    public static void bar() {
      // more blabla
    }

}
1 голос
/ 26 октября 2010

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

В любом случае, могу ли я напомнить, что на сайте PMD также сказано, что проблемаспорный:)

...