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

Сколько кода нужно добавить в конструктор?

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

4b9b3361

Ответ 1

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

Ответ 2

Взгляните на этот вопрос SO. Несмотря на то, что другой для С++, понятия по-прежнему очень похожи.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

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

Рассмотрим это.

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);
    }   
}

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

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

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

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

Ответ 9

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