Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Код в конструкторе / 25 сообщений из 72, страница 1 из 3
19.10.2020, 14:23
    #40009842
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
Как правильно реализовать класс, который должен выполнить определенные предварительные действия?

Абстрактный пример:
Допустим, нужно создать класс, которые будет получать через параметр конструктора имя файла. При его создании парсить этот файл и сохранять строки в мапу. После чего пользователь, методом getLine() сможет дергать эти строки.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class Reader{

   privete final Map<Integer, String> sentences;

   // Конструктор
   public Reader(Path file){
   }

   public String getLine(int index){
      return sentences.get(index);
   }
}



1). Писать код в конструкторе - это же плохо?
2). Т.е. что делать если нужно провести определенную инициализацию класса (но не простое присвоение значений полям, а определенная логика)?
...
Рейтинг: 0 / 0
19.10.2020, 14:31
    #40009845
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen,
Общие правила.
- инициализировать лучше в конструкторе если это не обращение к внешним ресурсам, внешним ИС, либам и не будет райзе 99,9%
...
Рейтинг: 0 / 0
19.10.2020, 14:34
    #40009846
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen,
Так как файл - внешний ресурс, то нужно сделать доп метод напр. open() или init()
...
Рейтинг: 0 / 0
19.10.2020, 14:35
    #40009847
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen
Как правильно реализовать класс, который должен выполнить определенные предварительные действия?

1). Писать код в конструкторе - это же плохо?
2). Т.е. что делать если нужно провести определенную инициализацию класса (но не простое присвоение значений полям, а определенная логика)?


1) Ну почему плохо?!
Кто запрещает?

Ну если не хотите писать тело в конструкторе, напишите в отдельной функции.
Которую потом вызовите в конструкторе.
...
Рейтинг: 0 / 0
19.10.2020, 14:44
    #40009850
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
PetroNotC Sharp, т.е. будет выглядеть так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Reader{

   privete final Map<Integer, String> sentences;

   // Конструктор
   public Reader(Path file){
      open(file);
   }

   public String getLine(int index){
      return sentences.get(index);
   }

   private void open(Path file){
       // some logic;
   }
}


?

Если это не является bad practise, то ок. Вообщем то это и был основной вопрос.
...
Рейтинг: 0 / 0
19.10.2020, 14:52
    #40009856
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen,
Не так. Нельзя открывать или обращатся в конструкторе
...
Рейтинг: 0 / 0
19.10.2020, 15:21
    #40009873
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
PetroNotC Sharp

Не так. Нельзя открывать или обращатся в конструкторе

mad_nazgul
1) Ну почему плохо?!
Кто запрещает?


сами авторы Java о таком запрещении почему-то не знают.

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#FileInputStream(java.io.File)
...
Рейтинг: 0 / 0
19.10.2020, 15:22
    #40009874
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen

Если это не является bad practise, то ок. Вообщем то это и был основной вопрос.


beauty is in the eye of the beholder
...
Рейтинг: 0 / 0
19.10.2020, 19:58
    #40009989
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
Правильнее всего сделать статический метод инициализатор, который возвращает option, ну в джаве в принципе можно и исключение кинуть.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Class Builder (

Public static Builder makeBuilder(path)(
 //Init resource
 New Builder()
)





)
...
Рейтинг: 0 / 0
19.10.2020, 20:06
    #40009995
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
Leonid Kudryavtsev,

так, то - боги
...
Рейтинг: 0 / 0
19.10.2020, 20:42
    #40010002
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
забыл ник,
Щаз мы его фабрикой классов или паттерном Строитель добьем)))
...
Рейтинг: 0 / 0
19.10.2020, 21:06
    #40010006
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
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

Основное правило это целесобразность таокого подхода в каждом конкретном случае. В общем случае это просто подозрительный код или неудачный дизайн.
...
Рейтинг: 0 / 0
19.10.2020, 23:43
    #40010025
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen,

да на самом деле та же проблема, что и в плюсах, и в шарпе - отсутствие поддержки виртуальных методов в конструкторе
как говорится: проблема в языке by design - приходится вот так костылять с помощью init-методов

натягивают целесообразность такого подхода возможностью оптимизации на уровне компиляции
...
Рейтинг: 0 / 0
20.10.2020, 00:50
    #40010033
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
faustgreen
Абстрактный пример:
Допустим, нужно создать класс, которые будет получать через параметр конструктора имя файла. При его создании парсить этот файл и сохранять строки в мапу. После чего пользователь, методом getLine() сможет дергать эти строки.

Можно при вызове getLine() проверять есть ли экземпляр мапы и если нет, считывать и парсить файл (вызов соответствующего метода). Можно написать класс Reader с парсингом файла в конструкторе и сделать к нему виртуальную проксю LazyReader, которая при инициализации записывает имя файла в приватную переменную, также имеет приватное поле Reader, при вызове getLine() проверяет есть ли экземпляр Reader если нет то создает его и вызывает getLine() у экземпляра Reader.
...
Рейтинг: 0 / 0
20.10.2020, 08:23
    #40010070
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
graycode,

авторМожно написать класс Reader с парсингом файла в конструкторе и сделать к нему виртуальную проксю LazyReader, которая при инициализации записывает имя файла в приватную переменную, также имеет приватное поле Reader, при вызове getLine() проверяет есть ли экземпляр Reader если нет то создает его и вызывает getLine() у экземпляра Reader.
Круто)))
...
Рейтинг: 0 / 0
20.10.2020, 08:38
    #40010074
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
Выскажу свою точку зрения.
Конечно код в конструкторе писать можно, но есть одно большое НО.
Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан.
Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним.
...
Рейтинг: 0 / 0
20.10.2020, 08:59
    #40010077
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
SQL2008
Выскажу свою точку зрения.
Конечно код в конструкторе писать можно, но есть одно большое НО.
Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан.
Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним.
и какой вам смысл от объекта который не может на данный момент сделать что надо? :-)
...
Рейтинг: 0 / 0
20.10.2020, 09:11
    #40010080
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
kealon(Ruslan)
SQL2008
Выскажу свою точку зрения.
Конечно код в конструкторе писать можно, но есть одно большое НО.
Конструктор это процедура создания объекта и получается, что в случае ошибок выполнения кода сам объект не будет создан.
Мне думается правильно вначале создать объект, пусть практически пустой, а потом уже выполнять некоторые действия с ним.
и какой вам смысл от объекта который не может на данный момент сделать что надо? :-)


Fast Fail однако!

<:o)
...
Рейтинг: 0 / 0
20.10.2020, 09:45
    #40010089
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
kealon(Ruslan),
Объекта и не будет. Будет инициализация переменной в памяти.
А потом можно рожать полноценный 1000 способов.
У меня в коде противопоказания только на исключение и зависание.
Ну и раздельно удобно переинициализацию делать
ob.init(file1)
ob.init(file2)
...
Рейтинг: 0 / 0
20.10.2020, 09:50
    #40010091
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
кажется тут речь о том что вроде как, в спрингбинах и не только спринг в конструктор код не засунуть кроме this.whateverField=whateverField
и юзать можно-нужно типа постконструкт или как он там.
...
Рейтинг: 0 / 0
20.10.2020, 10:40
    #40010104
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
PetroNotC Sharp
kealon(Ruslan),
Объекта и не будет. Будет инициализация переменной в памяти.
А потом можно рожать полноценный 1000 способов.
У меня в коде противопоказания только на исключение и зависание.
Ну и раздельно удобно переинициализацию делать
ob.init(file1)
ob.init(file2)
ну как не будет, память выделена, валидная ссылка на него есть
да и если "потом рожать" чем это отличается от "создать"?

я понимаю что при таком подходе, например в плюсах, можно на этапе копиляции создать объект
в java то какой профит?
...
Рейтинг: 0 / 0
20.10.2020, 10:53
    #40010105
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
andreykaT,
Да
...
Рейтинг: 0 / 0
20.10.2020, 10:56
    #40010107
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
kealon(Ruslan),
Дак и разговор про универсальный совет под все ЯП.
Универсальный - объект без райзе и гарантированно создаваемый. Это назначение конструктора.
В java тоже есть заморочки чтобы следовать этому правилу. Не прогер тут создает объект.))))
Тут new давно не пишут
))))
...
Рейтинг: 0 / 0
20.10.2020, 10:57
    #40010108
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
andreykaT
кажется тут речь о том что вроде как, в спрингбинах и не только спринг в конструктор код не засунуть кроме this.whateverField=whateverField
и юзать можно-нужно типа постконструкт или как он там.
вынужденое потокание архитектурному решению спринга понятно, но в чём смысл категорично распространять его на всё?


PetroNotC Sharp
...
Ну и раздельно удобно переинициализацию делать
ob.init(file1)
ob.init(file2)

что мешает сделать и так, и так?
...
Рейтинг: 0 / 0
20.10.2020, 10:58
    #40010109
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в конструкторе
kealon(Ruslan)
что мешает сделать и так, и так?
?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Код в конструкторе / 25 сообщений из 72, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]