Я думал, сколько кода нужно поместить в конструкторы в Java? Я имею в виду, очень часто вы создаете вспомогательные методы, которые вы вызываете в конструкторе, но иногда возникают некоторые более длительные операции инициализации, например, для программы, которая читается из файла или пользовательских интерфейсов или других программ, в которых вы инициализировать только переменные экземпляра, в которых конструктор может получить больше времени (если вы не используете вспомогательные методы). У меня есть что-то в виду, что конструкторы должны быть короткими и краткими, не так ли? Есть ли исключения?Сколько кода нужно добавить в конструктор?
ответ
Если вы идете по принципам SOLID, у каждого класса должна быть одна причина для изменения (т. Е. Сделать одно). Поэтому конструктор обычно не читает файл, но у вас будет отдельный класс, который создает объекты из файла.
спасибо, вы просто помогли мне избежать нарушений СРП! –
Столько, сколько потребуется для завершения инициализации объекта.
Если вы можете говорить о порции (около 5 строк моей рекомендации) вашего конструктора как куска логики или конкретного процесса, лучше всего разделить его на отдельный метод для ясности и организационных целей.
Но каждому свой.
Конструкторы должны быть не только достаточно долго, но не более =)
Если вы определяете несколько перегружены конструкторы, не дублировать код; вместо этого объединить функциональность в один из них для улучшения ясности и простоты обслуживания.
Эй, хорошая практика для добавления аксессуаров в конструкторы? –
Как сказал Кнут: «Преждевременная оптимизация - это корень всего зла».
Сколько стоит положить в конструктор? Все, что вам нужно. Это «нетерпеливый» подход. Когда - и только когда - производительность становится проблемой, вы рассматриваете ее оптимизацию (к «ленивым» или «чрезмерным» подходам).
Производительность обычно не является проблемой; техническое обслуживание есть! Я не уверен, что избегаю преждевременной оптимизации, избегая преждевременной оптимизации обслуживания ... – skiphoppy
Да, я не думаю, что эта проблема связана с производительностью ... это больше о разработке надлежащего кода, который может быть удобным и понятным для других. –
Да и лучший способ написать код поддерживаемого кода - написать его прямо (т.е. нетерпеливо). Кэширование для производительности имеет тенденцию к grealty усложнять код, что является контрпродуктивным, если производительность не является проблемой. – cletus
Посмотрите на this SO question. Несмотря на то, что другой для C++, концепции по-прежнему очень похожи.
Конструкторы должны создать минимальный, общий экземпляр вашего объекта. Как общий? Выберите те тесты, которые каждый экземпляр или объект, который наследует от класса, должен пройти, чтобы быть допустимым - даже если «действительный» означает только изящное изложение (запрограммированное сгенерированное исключение).
В Википедии есть хорошее описание:
http://en.wikipedia.org/wiki/Constructor_(computer_science)
Действительный объект является целью конструктора, действительный не обязательно полезно - что может быть сделано в методе инициализации.
Моя обычная практика заключается в том, что если все, что должен сделать конструктор, это установить некоторые поля на объект, он может быть сколь угодно длинным. Если он слишком длинный, это означает, что дизайн класса в любом случае разбит, или данные должны быть упакованы в некоторые более сложные структуры.
Если, с другой стороны, входные данные требуют некоторой более сложной обработки перед инициализацией полей класса, я стараюсь дать конструктору обработанные данные и переместить обработку на статический заводский метод.
Возможно, ваш класс должен быть инициализирован в определенном состоянии, прежде чем с ним можно будет выполнить любую полезную работу.
Рассмотрите это.
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);
}
}
Теперь, если вы не инициализировать varialble член DateOfBirth, любой последующий вызов getYearOfBirth(), приведет к NullPointerException.
Таким образом, абсолютный минимум инициализации, которая может включать в себя
- Присвоение значений.
- Вызов вспомогательных функций.
, чтобы гарантировать, что класс ведет себя корректно, когда его члены вызываются позже, все, что нужно сделать.
Конструктор подобен мастеру установки Application где вы только конфигурацию. Если Экземпляр готов принять любые (возможные) Действие на себя тогда Конструктор преуспевающий.
попробовать эту статью, следует ответить на ваш вопрос: http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256