Як перемагати з Java | Відеозапис вебінару для ЗСУ 🇺🇦
👉 Приєднуйся до Bobocode Community: www.bobocode.com/
________________________________________
Patreon: / bobocode
GitHub: github.com/bobocode-projects
Telegram: t.me/bobocode
LinkedIn: bit.ly/2RWPQF5
Twitter: bit.ly/3vaQiOl
Тарас в LinkedIn: bit.ly/2ElWg8J
Тарас в Twitter: bit.ly/33Pmuwg
________________________________________
00:00 - початок
01:33 - agenda
03:58 - перед тим як почати
05:03 - питання
05:28 - частина 1. дженеріки
09:23 - що означає що дженеріки стираються?
18:55 - дженеріки в рантаймі Spring-а
28:39 - де зберігається мета-інформація про дженеріки?
32:11 - частина 2. Функціональне програмування
35:33 - метод collect(). Завдання toStack().
38:35 - різниця між лямбдою і метод референс з точки зору байткоду.
40:11 - розбір задачі toStack().
45:08 - робота з базами даних.
46:18 - індексація даних в БД.
56:38 - питання
59:00 - частина 2. Робота з базами через Hibernate
01:08:51 - як зробити коректний мапінг @OneToMany зв’язків щоб уникнути “зайвих” запитів в БД?
01:16:21 - підсумки 2ї частини
01:17:30 - частина 3. Spring Data.
01:20:43 - проблема N+1
01:23:47 - з якими нюансами можна зіткунися при фіксі N+1.
01:29:55 - оптимізація вигрузки унікальниз даних з допомогою distinct і QueryHint.
01:35:19 - анотації @Transactionsl I @Async, нюанси які можуть виникнути
01:42:27 - антипатерн open-in-view і навіщо Spring boot його використовує?
01:46:05 - стрімінг даних з бази.
02:00:14 - питання
02:06:49 - як навчатись ефективно
02:11:45 - про Bobocode
02:14:36 - фінальна частина
Пікірлер: 22
🙏🏼 Дякую за Ваші донати: send.monobank.ua/jar/3tSN5fDiMv 💳 Номер картки банки: 5375 4112 0850 2919
Найкращий канал по Java який я знаходив. Дякую за ваш контент!
@Bobocode
7 ай бұрын
Дякую за таку високу оцінку! 🙏
Дуже класне відео. Дякую що все так ретельно пояснюєте
@Bobocode
7 ай бұрын
Дякую за коментар і за донат! 🙂
Як завжди вдячність автору, шикарний контент, поєднання глибини + цікаві практичні приклади, краще що є по Java в українському KZread. Дуже хочеться чути щось подібне від кандидатів на технічному інтервʼю. Вже більш як 2+к переглядів, контент не для початківців, а банка все ще не закрита...
Топчик 👍
@Bobocode
6 ай бұрын
Дякую! 🤩
Щодо стирання типів. 29:44. Тут краще пояснити наступним чином. Коли у нас є доступ до коду (через рефлексію) де оголошується конкретний тип дженерика, - тобто там, де тип T уже фіксується, і замість List у нас List - то ми можемо витягнути інформацію про тип дженерика, фактично "розпарсивши" цей клас через рефлексію. А там, де в нас намає фіксації типу - наприклад: T[] createArray() чи у виразах як-то if(x instanceof(List)), де намає доступа через рефлексію -- ми цю інформацію отримати не можемо.
Далеко не всі generic-и стираються. Локальні змінні - так. Але поля і параметри методів - мають в runtime інформацію про generic-и, яку можна отримати через reflection.
@Bobocode
7 ай бұрын
Підчас компіляції стираються абсолютно всі дженеріки. Якщо не вірите - подивіться байт-код. Те, про що ви кажете - це метадані. Так, інформація про те, якими були параметри типу і аргументи типу зберігається в метаданих класу і доступна через рефлексію, але сам тип в коді завжди стирається до верхньої межі. До речі, відповідні приклади з рефлексією я також показував.
@ArchonLicht
7 ай бұрын
@@Bobocode Метадані в даному випадку про дженеріки - про це і мова що вони залишаються. Я бачу вже ваш приклад - написав коментар подивившись першу частину. Ви трохи суперечливо пояснюєте, складається враження що вся інформація стирається повністю. Те, що на рівні байт коду є об'єкт а не якийсь конкретний тип це мало що говорить - в кінці кінців на рівні машкодів потім немає типів, а є лише пам'ять і реєстри.
@Bobocode
7 ай бұрын
@@ArchonLichtдобре, що ми розібралися ;)
@sku796
7 ай бұрын
Дженерики стрираються. Коли мова йде про стирання типів -- мова саме про рантайм типи. А Ви плутаеєте інформацію про *типи* *змінних* - які теоретично можна витягнути через рефлексію (але не завжди, і не найшвидшим чином ) - з реальними рантайм *типами* *даних* . В джаві маючи лише дані, ми ніяк не можемо визначити їх 'дженерик' тип -- чи то instanceof Processor, чи instanceof Processor. Коли ви говорите про поля і параметри методів -- ви переходите до рефлексії і оголошених (declared) типів -даних- контейнерів а вони можуть дуже сильно відрізнятись від рантайм типів даних, які зберігались в цих контейнерах. Крім того, ви навіть доступу до declared типу можете не мати. Наприклад, коли пишете бібліотеку, яка буде працювати з класами, які, можливо, ще взагалі ніхто не написав. Для прикладу, якщо у вас буде поле List p = new List, то інформацію про тип Circle ви ніяк не витягнете і, відповідно, не зможете зробити десь у себе new T(). максимум зарезолвите T як AbstractFigure з якою new немає сенсу робити, та й джава не дозволить. Крім того, не всі поля/методи мають в рантайм інформацію про дженерики. Приклад: void doSomething(T param) В мовах, де інформація про тип не стрирається (С#) ви можете спокійно визначити рантайм тип дженерик- змінної, навіть якщо вона прийшла до вас як Object, тобто ось таке: Boolean isStringProcessor(Object o){ return o.GetType() == typeof(List)} там буде працювати. Та й там звичайне new T() працює без усякої рефлексії.
@ArchonLicht
7 ай бұрын
@@sku796 Я знаю що стирається, що - ні. Ніяких «теоретично» - інформація про дженеріки у класів, в тч для приватних полів, зберігається, і може бути отримана рефлекшном. Не зберігається зовсі нічого лише для локальних змінних. Те, що в байткоді немає дженеріків, не означає що в рантаймі взагалі нічого немає. А автор спочатку говорить, що «все стирається», а потім сам же показує, що не все.
Щоб це все розуміти який рівень потрібно? Цеж не джунівський рівень чи я помиляюсь?
@Bobocode
7 ай бұрын
А з чого ви взяли, що це має бути джунівський рівень? Bobocode - це школа для досвідчених інженерів, відповідно більшість відео і завдань зроблені для досвідчених інженерів і потребують відповідного рівня.
@BCEMCPATb
7 ай бұрын
@@Bobocode я просто сподіваюсь що маю знання на джун позицію а тут відео де я не доганяю і мене аж впіт кинуло. Тому і запитав. Просто знаю що ви багато пояснюєте для початківців і подумав що рівень так виріс. Дякую за відповідь, аж від сраки відлипло.))
@sku796
7 ай бұрын
@@BCEMCPATb Щоб так одразу доганяти, про що йде мова - з цим потрібно попрацювати і зрозуміти суть проблеми, побачити її. Щодо дженериків -- найяскравіштй приклад: спробуйте в одному класі оголосити 2 методи, які оверрайдять один одного. Один має роздруковувати список строк, інший - список людей: print(List ls){} print(List lp){}.