2010-10-26 6 views
10

Checkstyle говорит:По умолчанию конструктор хороший или злой? Checkstyle и PMD противоположны здесь

Class should define a constructor. 

PMD говорит:

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

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

+0

Это просто проблема стиля. Сгенерированный код тот же. –

ответ

13

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

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

1

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

Во всяком случае, я хотел бы напомнить вам, что веб-сайт PMD также сообщил, что этот вопрос является спорным :)

1

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

} 
+3

Как это невозможно? Если он используется, и нет другого конструктора, то, очевидно, он должен быть предназначен. – DJClayworth

+2

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

+0

@andrewmu Да, это было мое намерение. – helpermethod

6

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

1

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

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

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

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

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

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

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

8

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

+0

+1 - Мне напомнили о богословских дебатах о том, сколько ангелов могут танцевать на голове булавки ... –

1

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

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

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

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


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

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

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

+4

Ну, вы также можете инициализировать поля, где вы их объявляете, например 'private int length = 10;', которые возможно, делает все более ясным, поскольку он связывает поле и его значение по умолчанию вместе. – gustafc

+0

http://goo.gl/IlpZ –

1

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

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

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