|
Код в конструкторе
|
|||
---|---|---|---|
#18+
Как правильно реализовать класс, который должен выполнить определенные предварительные действия? Абстрактный пример: Допустим, нужно создать класс, которые будет получать через параметр конструктора имя файла. При его создании парсить этот файл и сохранять строки в мапу. После чего пользователь, методом getLine() сможет дергать эти строки. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
1). Писать код в конструкторе - это же плохо? 2). Т.е. что делать если нужно провести определенную инициализацию класса (но не простое присвоение значений полям, а определенная логика)? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:23 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen, Общие правила. - инициализировать лучше в конструкторе если это не обращение к внешним ресурсам, внешним ИС, либам и не будет райзе 99,9% ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:31 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen, Так как файл - внешний ресурс, то нужно сделать доп метод напр. open() или init() ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:34 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen Как правильно реализовать класс, который должен выполнить определенные предварительные действия? 1). Писать код в конструкторе - это же плохо? 2). Т.е. что делать если нужно провести определенную инициализацию класса (но не простое присвоение значений полям, а определенная логика)? 1) Ну почему плохо?! Кто запрещает? Ну если не хотите писать тело в конструкторе, напишите в отдельной функции. Которую потом вызовите в конструкторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:35 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, т.е. будет выглядеть так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
? Если это не является bad practise, то ок. Вообщем то это и был основной вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:44 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen, Не так. Нельзя открывать или обращатся в конструкторе ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:52 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Не так. Нельзя открывать или обращатся в конструкторе mad_nazgul 1) Ну почему плохо?! Кто запрещает? сами авторы Java о таком запрещении почему-то не знают. https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#FileInputStream(java.io.File) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 15:21 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen Если это не является bad practise, то ок. Вообщем то это и был основной вопрос. beauty is in the eye of the beholder ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 15:22 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
Правильнее всего сделать статический метод инициализатор, который возвращает option, ну в джаве в принципе можно и исключение кинуть. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:58 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, так, то - боги ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:06 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
забыл ник, Щаз мы его фабрикой классов или паттерном Строитель добьем))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:42 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen 2). Т.е. что делать если нужно провести определенную инициализацию класса (но не простое присвоение значений полям, а определенная логика)? Обычно для этой цели создают метод init с кодом возврата или ексепшином в зависимости от того чего там написано. Это сложившиеся практика еще с прошлого века. Вот вполне обоснованные дискуссии по этому поводу https://softwareengineering.stackexchange.com/questions/334970/are-init-methods-a-code-smell https://gamedev.stackexchange.com/questions/48446/why-should-i-use-separate-initialization-and-clean-up-methods-instead-of-putting Основное правило это целесобразность таокого подхода в каждом конкретном случае. В общем случае это просто подозрительный код или неудачный дизайн. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 21:06 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen, да на самом деле та же проблема, что и в плюсах, и в шарпе - отсутствие поддержки виртуальных методов в конструкторе как говорится: проблема в языке by design - приходится вот так костылять с помощью init-методов натягивают целесообразность такого подхода возможностью оптимизации на уровне компиляции ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 23:43 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
faustgreen Абстрактный пример: Допустим, нужно создать класс, которые будет получать через параметр конструктора имя файла. При его создании парсить этот файл и сохранять строки в мапу. После чего пользователь, методом getLine() сможет дергать эти строки. Можно при вызове getLine() проверять есть ли экземпляр мапы и если нет, считывать и парсить файл (вызов соответствующего метода). Можно написать класс Reader с парсингом файла в конструкторе и сделать к нему виртуальную проксю LazyReader, которая при инициализации записывает имя файла в приватную переменную, также имеет приватное поле Reader, при вызове getLine() проверяет есть ли экземпляр Reader если нет то создает его и вызывает getLine() у экземпляра Reader. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 00:50 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
graycode, авторМожно написать класс Reader с парсингом файла в конструкторе и сделать к нему виртуальную проксю LazyReader, которая при инициализации записывает имя файла в приватную переменную, также имеет приватное поле Reader, при вызове getLine() проверяет есть ли экземпляр Reader если нет то создает его и вызывает getLine() у экземпляра Reader. Круто))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 08:23 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
Выскажу свою точку зрения. Конечно код в конструкторе писать можно, но есть одно большое НО. Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан. Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 08:38 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
SQL2008 Выскажу свою точку зрения. Конечно код в конструкторе писать можно, но есть одно большое НО. Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан. Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 08:59 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
kealon(Ruslan) SQL2008 Выскажу свою точку зрения. Конечно код в конструкторе писать можно, но есть одно большое НО. Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан. Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним. Fast Fail однако! <:o) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 09:11 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
kealon(Ruslan), Объекта и не будет. Будет инициализация переменной в памяти. А потом можно рожать полноценный 1000 способов. У меня в коде противопоказания только на исключение и зависание. Ну и раздельно удобно переинициализацию делать ob.init(file1) ob.init(file2) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 09:45 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
кажется тут речь о том что вроде как, в спрингбинах и не только спринг в конструктор код не засунуть кроме this.whateverField=whateverField и юзать можно-нужно типа постконструкт или как он там. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 09:50 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
PetroNotC Sharp kealon(Ruslan), Объекта и не будет. Будет инициализация переменной в памяти. А потом можно рожать полноценный 1000 способов. У меня в коде противопоказания только на исключение и зависание. Ну и раздельно удобно переинициализацию делать ob.init(file1) ob.init(file2) да и если "потом рожать" чем это отличается от "создать"? я понимаю что при таком подходе, например в плюсах, можно на этапе копиляции создать объект в java то какой профит? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 10:40 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
kealon(Ruslan), Дак и разговор про универсальный совет под все ЯП. Универсальный - объект без райзе и гарантированно создаваемый. Это назначение конструктора. В java тоже есть заморочки чтобы следовать этому правилу. Не прогер тут создает объект.)))) Тут new давно не пишут )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 10:56 |
|
Код в конструкторе
|
|||
---|---|---|---|
#18+
andreykaT кажется тут речь о том что вроде как, в спрингбинах и не только спринг в конструктор код не засунуть кроме this.whateverField=whateverField и юзать можно-нужно типа постконструкт или как он там. PetroNotC Sharp ... Ну и раздельно удобно переинициализацию делать ob.init(file1) ob.init(file2) что мешает сделать и так, и так? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 10:57 |
|
|
start [/forum/topic.php?desktop=1&fid=59&tid=2120650]: |
0ms |
get settings: |
19ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
68ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
444ms |
get tp. blocked users: |
0ms |
others: | 293ms |
total: | 835ms |
0 / 0 |