Подтвердить что ты не робот

Конструктор по умолчанию - это хорошо или зло? Checkstyle и PMD здесь противоположны

Checkstyle говорит:

Class should define a constructor.

PMD говорит:

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

Кто прав? Или пусть это так: какие плюсы и минусы имеют пустой класс по умолчанию в классе?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Я пойду с 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
    }

}

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

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

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

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


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

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

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

Ответ 8

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

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

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