Сколько кода нужно поместить в конструктор? - PullRequest
20 голосов
/ 10 февраля 2009

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

Ответы [ 9 ]

12 голосов
/ 10 февраля 2009

Если вы следуете принципам SOLID , у каждого класса должна быть одна причина для изменения (т.е. сделать одну вещь). Поэтому конструктор обычно не будет читать файл, но у вас будет отдельный класс, который создает объекты из файла.

4 голосов
/ 10 февраля 2009

Взгляните на этот ТАК вопрос . Несмотря на то, что другой предназначен для C ++, концепции все еще очень похожи.

2 голосов
/ 10 февраля 2009

Столько, сколько необходимо для завершения инициализации объекта.

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

Но каждому свое.

1 голос
/ 10 февраля 2009

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

Википедия имеет хорошее описание:

http://en.wikipedia.org/wiki/Constructor_(computer_science)

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

1 голос
/ 10 февраля 2009

Как сказал Кнут, «Преждевременная оптимизация - корень всего зла».

Сколько стоит положить в конструктор? Все, что вам нужно Это «нетерпеливый» подход. Когда - и только когда - производительность становится проблемой, вы рассматриваете ее оптимизацию (для подходов "ленивый" или "чрезмерный")

1 голос
/ 10 февраля 2009

Конструкторы должны быть достаточно длинными, но не длиннее =)

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

0 голосов
/ 26 мая 2011

Конструктор похож на Мастер установки приложений , в котором вы выполняете только конфигурацию . Если Экземпляр готов выполнить любое (возможное) Действие над собой, тогда Конструктор справляется.

0 голосов
/ 10 февраля 2009

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

Учтите это.

public class CustomerRecord
{
    private Date dateOfBirth;

    public CustomerRecord()
    {
        dateOfBirth = new Date();
    }

    public int getYearOfBirth()
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateOfBirth);
        return calendar.get(Calendar.YEAR);
    }   
}

Теперь, если вы не инициализируете переменную члена dateOfBirth, любой последующий вызов getYearOfBirth () приведет к исключению NullPointerException.

Итак, минимальная инициализация, которая может включать

  1. Присвоение значений.
  2. Вызов вспомогательных функций.

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

0 голосов
/ 10 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...