Ответ 1
Если вы идете по принципам SOLID, у каждого класса должна быть одна причина для изменения (т.е. сделать одно). Поэтому конструктор обычно не читает файл, но у вас будет отдельный класс, который создает объекты из файла.
Я думал, сколько кода нужно поместить в конструкторы в Java? Я имею в виду, очень часто вы создаете вспомогательные методы, которые вы вызываете в конструкторе, но иногда возникают некоторые более длительные операции инициализации, например, для программы, которая читается из файла или пользовательских интерфейсов или других программ, в которых вы инициализировать только переменные экземпляра, в которых конструктор может получить больше времени (если вы не используете вспомогательные методы). У меня есть что-то в виду, что конструкторы должны быть короткими и краткими, не так ли? Есть ли исключения?
Если вы идете по принципам SOLID, у каждого класса должна быть одна причина для изменения (т.е. сделать одно). Поэтому конструктор обычно не читает файл, но у вас будет отдельный класс, который создает объекты из файла.
Взгляните на этот вопрос SO. Несмотря на то, что другой для С++, понятия по-прежнему очень похожи.
Достаточно немного, необходимое для завершения инициализации объекта.
Если вы можете говорить о части (5 строк - это моя рекомендация) вашего конструктора как кусок логики или конкретного процесса, лучше всего разделить его на отдельный метод для ясности и организационных целей.
Но каждому свое.
Конструкторы должны быть достаточно длинными, но не более =)
Если вы определяете несколько перегруженных конструкторов, не дублируйте код; вместо этого консолидируйте функциональность в один из них для улучшения ясности и простоты обслуживания.
Как сказал Кнут: "Преждевременная оптимизация - это корень всего зла".
Сколько вы должны положить в конвейер? Все, что вам нужно. Это "нетерпеливый" подход. Когда - и только когда - производительность становится проблемой, вы рассматриваете ее оптимизацию (к "ленивым" или "чрезмерным" подходам).
Конструкторы должны создать минимальный, общий экземпляр вашего объекта. Как общий? Выберите те тесты, которые каждый экземпляр или объект, который наследует от класса, должен пройти, чтобы быть допустимым - даже если "действительный" означает только изящное изложение (запрограммированное сгенерированное исключение).
Википедия имеет хорошее описание:
http://en.wikipedia.org/wiki/Constructor_(computer_science)
Действительный объект - это цель конструктора, действительная необязательно полезная - это может быть сделано в методе инициализации.
Моя обычная практика заключается в том, что если все конструктор должен сделать, это установить некоторые поля для объекта, он может быть сколь угодно длинным. Если он слишком длинный, это означает, что дизайн класса в любом случае сломан, или данные должны быть упакованы в некоторые более сложные структуры.
Если, с другой стороны, входные данные нуждаются в более сложной обработке перед инициализацией полей класса, я склонен дать конструктору обработанные данные и переместить обработку в статический метод factory.
Возможно, ваш класс должен быть инициализирован в определенное состояние, прежде чем с ним можно будет сделать какую-либо полезную работу.
Рассмотрим это.
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.
Таким образом, минимальная инициализация, которая может включать
чтобы убедиться, что класс ведет себя корректно, когда он вызывается позже, - все, что нужно сделать.
Конструктор похож на Мастера установки приложений, в котором вы выполняете только конфигурацию. Если Экземпляр готов принять любое (возможное) действие по себе, то Конструктор будет хорошо работать.