Я всегда чувствовал, что в целом основная работа класса должна выполняться в его методах экземпляра, тогда как конструктор должен получить экземпляр только в полезное состояние.
Но я нахожу, что на практике бывают ситуации, когда кажется более целесообразным поместить всю фактическую работу в конструктор.
Один пример: мне нужно получить некоторую информацию, относящуюся к СУБД, из базы данных. Самый естественный способ для меня, казалось, имел класс DBMSSpecInfo, с конструктором:
public DBMSSpecInfo(java.sql.Connection conn) throws SQLException{
// ... retrieve info from DBMS
}
/** @returns max size of table in kiB */
public int getMaxTableSize() {//...}
/** @returns max size of index in kiB */
public int getMaxIndexSize() {//...}
/** @returns name of default schema */
public String getDefaultSchema() {//...}
Вы бы построили класс один раз, конструктор будет извлекать все данные, тогда вы можете использовать различные геттеры для получения необходимой информации.
Конечно, я мог бы поместить метод в другое место и использовать только DBMSSpecInfo
для возвращаемого значения (по существу используя DBMSSpecInfo только как держатель значения), но для создания класса просто для возврата значений из одной функции.
И что ты думаешь? Существуют ли проблемы с выполнением основной работы в конструкторе? Является ли это "неидиоматическим" в Java? Или это приемлемая (хотя, возможно, необычная) практика?