2009-02-10 1 views
19

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

+0

попробовать эту статью, следует ответить на ваш вопрос: http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256

ответ

10

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

+0

спасибо, вы просто помогли мне избежать нарушений СРП! –

2

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

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

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

1

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

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

+0

Эй, хорошая практика для добавления аксессуаров в конструкторы? –

1

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

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

+0

Производительность обычно не является проблемой; техническое обслуживание есть! Я не уверен, что избегаю преждевременной оптимизации, избегая преждевременной оптимизации обслуживания ... – skiphoppy

+0

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

+0

Да и лучший способ написать код поддерживаемого кода - написать его прямо (т.е. нетерпеливо). Кэширование для производительности имеет тенденцию к grealty усложнять код, что является контрпродуктивным, если производительность не является проблемой. – cletus

4

Посмотрите на this SO question. Несмотря на то, что другой для C++, концепции по-прежнему очень похожи.

1

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

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

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

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

0

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

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

0

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

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

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.

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

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

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

0

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