Подготовка к собеседованию на Java Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
друзья Всем привет Вы снова на канале jetballp и с вами снова Макс Добрынин тот самый разработчик который рассказывает вам про всякие всячины войтя о чем же мы сегодня с вами будем разговаривать и что тут у нас на видео сегодня будут показывать Специально для вас прежде чем узнаем это как обычно друзья подписываемся Наш канал ставим колокольчик и не забываем оставлять комментарии ведь это офигенно позволяет продвигаться нам на просторах YouTube напоминаю У нас есть крутой телеграм-канал там и постим
00:00:10 - 00:01:05
разнообразный квизы классные посты индивидуальные постыднее которые раскрывает чем мы там байт тех каждый день занимаемся и все это позволяет вас держать в тонусе чтобы вы готовились к собеседованию и в целом друзья готовились к жизни войти Ну что ж погнали разбираться что у нас сегодняшняя тема [музыка] и конечно же тот самый долгожданный момент друзья когда Мы возвращаемся к нашей излюбленной рубрике которая является Киллер фичей это конечно же публичные собеседования Именно поэтому сегодня у нас гостях Алексей и он будет
00:00:38 - 00:01:49
проходить то самое интервью на позицию Junior Java develper Ну что ж погнали Познакомимся с Алексеем гость у нас сегодня действительно очень необыкновенный Алексею всего лишь 21 год И он учится в Харьковском политехническом институте но нет Друзья Он учится не на айтишника как может показаться из грядущего видео он друзья учатся на экономиста тем не менее поработав в различных сферах от преподавания робототехники и базовой информатики в школе до подработки барменом Алексей понял что все-таки это
00:01:14 - 00:02:21
не его ему хотелось бы заниматься чем-то более интересным именно этим мысли позволили Алексею прийти войти ведь его друг порекомендовал ему записаться в учебный центр компании на курс automationals да-да те самые тестировщики автоматизаторы всё это позволило Алексей очень быстро Осознать что Java действительно очень крутой язык программирования и с ним можно сварить большое количество каши поэтому он не остановился на пройденных курсах и стал развиваться уже самостоятельно в настоящее время он занимается и Java и
00:01:48 - 00:02:52
javascripton или что реали собственные веб-решения параллельно он помогает в небольшом стартапе и конечно же как у любого человека у него есть мечта а мечта его довольно таки простая и четко установленная ворваться в it и получить крутую работу своей мечты Где он сможет перформить и развиваться как Java разработчик и как всегда после того как мы познакомились с нашим гостем пришла пора этого же гостя испытать что ж Поехали вместе да посмотрим какие вопросы Алексею вздос и насколько столько он их выдерживал Да и давал
00:02:19 - 00:03:28
крутые ответы и все это друзья в нашем собеседовании на позицию Junior Java Developer погнали [музыка] Алексей я тебя Приветствую ты попал на нашу рубрику канала где мы Разбираем бесплатные собеседование Разбираем разнообразные вопросы и получаем на них ответы как твое настроение Как ты себя чувствуешь перед собеседованием так тоже привет настроение супер чувствую себя немножечко встревожено немножечко но я думаю мы это исправим просто это мое первое собеседование вообще в жизни так сказать техническое собеседование поэтому хочу
00:02:54 - 00:04:18
показать себя на максимум и узнать чего я вообще стою волнуешься да Да немножечко но я думаю мы это немножечко пофиксием в будущем Ну все мы с этого начинаем это правильно всегда всегда так происходит волнуются все это нормально зазорного Нет ну что мы в нашем духе начнем тогда наш собеседование и начнем Самого простого есть у нас объект ориентированного программирования Расскажи пожалуйста что за такой Волшебный стол наследовать а Волшебный из наследования но один из трех волшебных Я считаю и наследуем
00:03:38 - 00:04:55
позволяет нам наследовать наши объекты и присылает их так сказать поля и уже готовые методы которые мы в дальнейшем можем использовать либо как-то модифицировать как-то дополнить и или вообще просто изменить с нуля то есть мы можем их так сказать дает нам и гибкость выборе и работе уже готовым каким-то куском кода Окей А что тогда полиморфизм полиморфизм Ну как я его Представляю это возможность сущности представлять себя или вести себя по-разному в зависимости от ее состояния но это очень хороший пример обычно приводится с
00:04:19 - 00:05:52
интерфейсами которые мы можем создать обычный интерфейс одним методом допустим и создать несколько классов которые будут имплементировать интерфейс и в каждый класс будет лимитировать его по-своему Исходя из логики этого класса и в конце мы просто можем этот метод вызвать у трех разных объектов будет один тот же метод одно и то же Название но будет выполняться абсолютно разные действия Вот я считаю это вот представитель полиморфизма Окей объяснял Круто А может тогда сказать разницу всем же все-таки отличие между наследованием и
00:05:06 - 00:06:19
полиморфизмом полиморфизм вроде позволяет определить свое поведение никакого то абстрактного поведения то что будет у всех но в целом это очень сильно смахивает на наследование когда мы используем интерфейс а какой-то базовый класс и потом переопределяем его методы Так все-таки в чем же отличие наследования от полиморфизма Я считаю тут Наверное какая-то Тонкая грань есть вот этих двух определениях все-таки наследуя ранее упоминал что мы можем использовать уже готовые имплементации мы уже можем использовать какую-то
00:05:43 - 00:07:01
реализацию данного класса и мы можем передать его свойства а полиморфизм Как по мне Он всего лишь над определенными методами которыми можно просто использовать в нашем коде и они будут так сказать адаптивный под исходя из тех данных которые приходят считает это Ну да принципе я с тобой здесь тоже соглашусь что основная задача наследования это получить то что уже реализовано то что мы уже можем переиспользовать и в случае необходимости расширить или дополнить чем-либо когда полиморфизм просто определяет наше поведение Скажи
00:06:21 - 00:07:42
пожалуйста слышал ли Ты что либо про выражение контракт или программирования по контракту можешь ли объяснить если слышал Так ну у нас то что я слышал По контракту У нас есть во первых контракт я не знаю если мы говорим про полиморфизм я бы сказал наверно контракт с интерфейсом который мы обязательно если мы им лимитируем какую-то интерфейс Мы обязаны по контракту реализовать все методы абстрактные методы которые входят в этот интерфейс Я считаю Может этот контракт именно так оно есть А зачем оно
00:07:02 - 00:08:10
так нам нужно вроде как бы и без контракта могли бы жить Почему так Это жизненно важно необходимо иметь контракт Спарки с полиморфизмом Ну контракт Конечно мы можем и сделать реализацию С возвращением Ну ладно я считаю это неправильно потому что все таки мы если создаем какой-то интерфейс мы создаем его исходя из какой-то бизнес задачи из логики какой-то и он должен создавать и иметь все включать точнее определенные методы определенной реализации Ну то есть какой-то идеей с посылом если мы хотим
00:07:37 - 00:08:57
чтобы наши классы которые имплементируют интерфейс реализовывает имеет это мы должны их реализовать все-таки мы должны все реализовать потому что каждый из них по логике исходя из у нас правильно архитектуры приложения то мы так сказать уже подразумеваем что у нас есть три метода интерфейсе все они три должны быть рабочие потому что другой программист зайдет посмотрим что у нас имплементация интерфейса вызовет один метод а он возвращает но он что это такое Ну да на самом деле хорошо отметил то есть по сути контракт нам позволяет
00:08:16 - 00:09:27
всегда получать то что интерфейс нам дает То есть он дает нам поведение методы и когда мы реализуем интерфейс по сути мы следуем контракту и стало быть не может быть класса который не реализовал бы в конечном итоге все методы этого интерфейса и таким образом полиморфизм работать нам все равно какие реализации по сути главное что каждый из этих реализаций будет обладать всеми методами которые предоставляет контракт хорошо давай тогда двинемся дальше слышал ли ты что-то про фундаментальные принципы соли
00:08:51 - 00:09:58
конечно слышал но так могу Наверное общую базу подчеркнуть потому что их сильно так не вникал то что я вот конкретно помню это у нас есть какой-то задача бизнес задача Например у нас класс должен реализовывать только одну задачу то есть мы должны впихивать в реализации всех наших бизнес-задачи В одни в один глаз куча методов Но это будет Неправильно То есть если у нас какой-то принтер печатаете отправлять нам сканы то мы должны сделать отдельный класс для принтера отдельно для там конвертации отдельно для отправки и так
00:09:24 - 00:10:35
далее То есть мы должны разделить общую задачу на несколько под задачей каждый класс должен отвечать только за свою задачу Я считаю вот так плюс Я слышал про интерфейсы что так на пальцах это лучше больше маленьких интерфейсов меньшим количеством метода чем один большой тоже так классно Может это одно и то же но больше наверное не скажу не скажу Окей на самом деле все это можно почитать в книге Роберта Мартина про архитектор в целом про нашу чистую архитектуру но в целом Ты назвал принцип данном случае мы говорим о том что
00:10:01 - 00:11:18
интерфейс должен быть ориентирован на выполнение только одной вещи и это далеко не всегда про его функционал в большей степени в книге даже ведется речь о том что здесь просто и холдером То есть если класс обслуживает интересы какого-то конкретного клиента или какой-то конкретный бизнес отрасли он только на нее должен быть ориентирован если отрасль отличается и при этом классы похожи друг на друга значит не факт что они похожи друг на друга поскольку отрасли уже разные и также называл интерфейс игры
00:10:45 - 00:11:53
он говорит действительно как ты отметил А лучше маленький интерфейс маленьким набором методов чем огромный крокодил который умеет делать очень много Здорово скажи слышал ли ты что-либо про шаблоны проектирования с шаблоны это паттерны да да дизайн патрон сможет назвать 2-3 23 исключая сингл тонны Ну давай Single Bon возьмем если о нем поговорим еще какой-нибудь один но не про то так могу Билдер адаптер декоратор прокси давай возьмем декоратор тогда начнем синглтона Расскажи зачем он нужен и мне больше интересует Какие виды
00:11:19 - 00:12:57
его существуют а синглтон представляет собой Ну так сказать паттерн говорит нам что мы создаем один раз объект либо получаем его откуда-то и каждый раз возвращаем один и тот же объект по запросу то есть мы создаем какой-то класс нашим объектом который и метод Get для этого объекта и мы проверяем на наличие если у нас есть в памяти то мы возвращаем его если нет мы его создаем и возвращаем его то есть принцип тот что мы постоянно Работаем только с одним объектом все изменения в любой части кода у нас приходят только
00:12:10 - 00:13:20
по одному объекту то есть мы просто Передаем один раз объект и на все линии нашей кода нашего кода Мы просто его наши изменения на каплями изменения Ну как пример Я считаю это логгер который мы можем сделать и постоянно просто один раз реализовать и записывать в один и тот же файл Ну как такой примерно ходу супер А какие вот два основных вида синглтон реализации два основных вида синглтон но они делятся Вот они по сути делают одно и то же вещь но работают по-разному Ты даже это в рассказе своем Тоне отметил
00:12:45 - 00:14:10
теперь пошла пришла пора немножко углубиться это я отметил логгер разве вопрос касательно как синглтон инициализирует свои значения он инициализирует тех методе при получении либо ты создания или немного не туда туда Так мы можем создать этот эту переменную либо получить ее откуда-то то есть мы можем где-то этот объект получить два таких примера наверное сейчас не придумаю Может я просто не туда иду нужно смотри всегда возникает вопрос Когда мы работаем сингл тон объектом ведь как правило это класс
00:13:27 - 00:15:07
и внутри находится instance он как правило так и называется вот мы можем получить инстас мгновенно и он всегда у нас будет доступен самого старта приложения когда дживенка запустилась или все-таки мы можем также получать instance только тогда когда кто-либо в нашей программе его первый раз за требовать вот как эти вещи называются прям называются Ну или как ты мог бы их описать не обязательно название Так ну первый инстанс когда мы сами его создаем и второй когда мы его получаем при запросе Ой как это можно так назвать
00:14:17 - 00:15:38
А что ты подразумеваешь когда мы сами его создаем это как Ну мы получается сами создаем Я просто подразумеваю сами создаем это когда мы вызываем сам объект возможно сам при инициализации объекта Мы например проверяем По условию что мы его еще ни разу не создавали и мы просто через неё ключевое слово его создали а при получении Я считаю мы просто используем какой-то объект даже Ну например базу данных которые мы просто можем получить какое-то значение то я не знаю как вариант немножко запутался но прям на 50
00:14:58 - 00:16:21
процентов точно угадал есть два варианта сингл тон первый и второй игр то есть жадный жадная инициализация и ленивая как раз ты описал когда мы пытаемся получить если там еще нет моего создаем присваиваем в дальнейшем постоянно ссылаемся на него а жадная инициализация она происходит во время старта GM когда мы запускаем программу и сразу как правило это же переменной нашего класса при своем значении И разумеется придет мы делаем проверку мы уже знаем что он по-любому инициализирует хорошо хорошо звучит Круто Давай тогда
00:15:40 - 00:16:57
поговорим про декоратор Расскажи что такое деграда и чем его смысл да сейчас просто тайдовой немножечко от синглтона от мог бы догадаться но не немножечко не туда нормально получается то что я считал что он служит для динамического дополнения уже существующая функционала Как пример Я помню есть Input Stream файл Input Stream буфер туда же и он работает по принципу как я понял работает по принципу подклассов то есть мы берем уже функционал и мы его просто дополняем какой-то реализации но я бы как пример пример привел бы пример с
00:16:18 - 00:17:53
допустим ридером нас есть интерфейс Reader допустим его У нас еще нет Джаве Мы его еще только сейчас придумаем у нас читает просто какой-то файлы с даже просто из системы и перевод его массив байтов То есть у нас один метод возвращает массив байтов мы этот метод реализуем в каком-то классе обычно Там просто Reader и друг нам нужно реализовать также метод чтобы он возвращал не только массив байтов А этот массив байтов массив чаров переводить мы можем сделать либо наследовать от уже существующего класса и дополнить его
00:17:06 - 00:18:24
метод либо имплементировать интерфейс и заново реализовать когда существующие возврат байта и заново Дописать нужную функцию либо создать декоратор который будет таким абстрактным классом как просто общим классом который будет все остальные наследоваться и декоратор будет имплементировать интерфейс нужный нам интерфейс и принимать все объекты уже созданного имплементации этого интерфейса с помощью это объекта будет реализовывать метод этого интерфейса И тем самым все следующие дополнения которые мы должны
00:17:45 - 00:18:54
вести Ну например перевод чармасив либо тот же самый час следующий мы должны там Стрим перевести то мы это будем делать наследовали от декоратора и реализовывая эту Суть в его уже методе но так по сути Как работа с подклассами только немножечко замудренная Ну иерархия соблюдается в конструкторе они в арктических классах таких Я понял На самом деле хорошо писал что по сути цель в том что мы можем добавить ему нового функционал то есть не изменяя изначальный класс или изначальный интерфейс мы можем его расширить
00:18:19 - 00:19:46
да Хорошо но у меня тут возник такой хитрый вопрос Ты сказал что мы пытаемся что-либо трансформировать Ну то есть предположим У нас есть массив байтиков то есть наш обычный байт Стрим или байт Стрим и вдруг мы захотели вы трансформировать в Стрим для этого Мы создали декоратор и вот тут у меня вопрос все-таки Это декоратор или это намекает на какой-то другой а я считаю это скорее всего намекает на адаптер Да правда потому что мы трансформируем мы не можем метод который у нас зазначен интерфейсом который
00:19:02 - 00:20:21
возвращает массив байтов превращать чтобы он возвращал ему на здесь массив чаров это уже Да это наверное скорее всего адаптер не так близко тоже но все шаблоны проектирования Они между собой так или иначе похоже многие вопрос Какие задачи не решают если мы говорим про декоратор его задача Добавить какой-то новый функционал зачастую декоратор обладает точно таким же интерфейсом которым обладает изначальный объект с которым будет работать соответственно если мы говорим про адаптер Это всего лишь адаптация к чему
00:19:43 - 00:20:52
либо и это вовсе нам не предоставляет необходимости соблюдать интерфейс То есть если декоратор стрима он должен обладать всем тем же поведением что обладает индустрии то в случае адаптации это может быть самолет на отдельный класс который всего лишь умеет работать стримом и адаптируется под Новый тип данных после того как он принимает импульс Стрим и байт Стрим под капотом В итоге а на выходе мы получаем там чистую строку или еще чего-либо но в целом ты ответил сразу три шаблона проектирования обсудили Давай тогда двинемся дальше
00:20:17 - 00:21:32
поговорим про класс object здесь будет быстро Из каких популярных методов он состоит и квел стринг найти Fine Alice там еще есть Игорь класс и Клон Окей зачем вообще нужен класс объект мне невдомет вот не могу понять вот зачем он создал Я же могу и другие классы создать В чем смысл Я вот тоже думаю над этим вопросом и пришел к выводу что у нас должно соблюдаться какая-то иерархия объекта во-первых Мы работаем Мы работаем с объектами то есть Нам нужен какой-то иерархический класс который будет реализации для всех остальных Тем самым
00:20:55 - 00:22:24
я пришел к выводу что если мы возьмем два разных например класса нас будет один обжиг другой не обжиг как мы сможем их программе сравнить мы никак не сможем потому что например iclus нас реализованных и шкод в обжиге а в другом классе У нас например их нету то есть он является таким основателем и задает основные показатели объекта которые мы уже можем там как-то расширять Я думаю вот так Абсолютно верно если сказать это в двух словах это абстракция ладно в одном слое абстракция вполне одно слово
00:21:39 - 00:22:48
да ты прав то есть это какой-то базовый иерархический класс который позволяет нам выстроить все остальные классы с точки зрения Java и языка программирования в единое древо этих классов Давай поговорим о Двух самых таких волшебных методов и хешко в чем заключается контракт между методом и голос и в том что если мы хотя бы раз реализуем хотя бы один из методом и обязаны ради второй потому что один без второго не может конкретно работать например они используются в той же самой Кошмар сайте для определения
00:22:14 - 00:23:39
и для реализации нам также если наш класс находится в как поле в другом классе для правильной работы для правильной реализации следующего класса нам нужно хеш-код Здесь Поэтому нам обязательно нужно его реализовать и eclass нужно потому что нам нужно как-то сравнить объекты Вот а вдруг разные вдруг нет Нам нужно знать а можешь пожалуйста назвать не способы а правила переопределения метода equals Ведь у него действительно есть правило они кстати написаны прямо в документации и им соответствующий метод
00:22:56 - 00:24:16
после определения должен соответствовать я сейчас исходя из реализации Ту которой я прописывал первое нам нужно проверить что на ссылки разные не разные то есть они ссылаются на один объект Они одинаково то есть ссылка на одну ссылку память имеет одну ссылку и они одинаковые также нам нужно обязательно проверить их на Потому что если ссылки нет Как мы можем проверить на равенство класса то есть мы должны взять классов сравнить их Если они у нас разные объекты абсолютно разные потому что Разные классы И проверить все поля
00:23:36 - 00:24:54
То есть если у нас поле ID равен единице в одном и втором один мы идем дальше если они не равны то мы объекта не равны а слышал ли ты что-то про такие выражения рефлексивность симметричность Да это вот отсюда просто не помню название Да давай попробуем разобрать вот эти два можешь писать Что обозначает рефлексивность еще я думаю это как-то связано с reflection 5 то есть это класс наш который можем использовать и так сказать присвоить наш объект приходящий к нашему классу То есть я думаю что если объекты
00:24:19 - 00:25:42
равны они должны иметь одинаковые места С класса чтобы их могли присвоить друг другу и сравнить уже исходя как одинаковые класса Окей асимметричность асимметричность симметрии но что-то я не знаю что ты уже с математики попахивает возможно как-то связано с То есть если там переменная А равняется переменной B то там равняет то B + C равняется что-то такое не совсем Ну смотри рефлексивность подразумевается то что если говорим про математику от переменные слагаемых особо не изменяется если мы сравниваем X как объект с другим
00:25:01 - 00:26:31
объектом X точно таким же то как бы там ни крути это всегда должно быть сам себе равен Смысл в этом симметричности мы подразумеваем то что в буквальном смысле если у нас есть два объекта и это X предположим и объект Y то когда мы сравниваем Y с иксом или наоборот X Y Если хоть в одной из комбинацию она возвращает True то в зависимости от того меняешься их местами положение меняешь Она всегда должна быть ипогейм это всего является то что это всегда относится к неноловым значениям То есть это должен быть так называемый
00:25:45 - 00:27:09
Ноу на Кстати это опять же можно посмотреть в официальные доки классу обжиг либо через интернет но в целом это круто начало описывать более ты описал уже реальную реализацию то что ты описал именно и реализует эти принципы их на самом деле чуть больше частности их 5 мы еще мы не прошли мы не обсудили транзитивность консистентность и в целом не Нал значения Мы это можем пустить Давай тогда двинемся дальше поговорим про string Почему string называют ему табельным классом стринг потому что ему табельный любое
00:26:28 - 00:28:04
изменение строки Как нам кажется Вроде мы его изменяем по сути мы создаем новые объекты при своем ссылку на этот объект и поэтому он ему табельный и наверное с этой же целью нам туда наши строки был дан стрельбу который помогает нам сохранить Вот этот ячейку памяти лишнюю которую мы можем сохранить тем самым что мы постоянно проверяем на наличие наших строк которые мы дополняем либо изменяем я думаю и за это Ну и мутабельность когда мы просто изменяем ну объектами не меняется нас постоянно тот же объект нас просто создается
00:27:21 - 00:28:34
резона А можно сказать просто string пол почему объекты попадают главный вопрос и вытекающие как это происходит с точки зрения программного кода не как все под капотом устроено а именно с точки зрения программного ухода Ну получается Если мы создаем строку с помощью двух кавычек то мы идем значит прямо в Стрим пол ищем нашу строку глянем если она есть там и просто ссылку на уже существующую строку в хиппи мы просто присылаем нашему объекту и из-за того что они ему табельны это позволяет нам делать И
00:27:59 - 00:29:24
если нас объекта там нет это мы просто его создаем и помещаем тоже а если мы создаем через ключевое слово не Вот мы игнорируем и помещаем сразу хип но Для таких случаев там же вроде метод есть да Если я не ошибаюсь хорошо Следующий вопрос опять же связанные со строкой в чем проблема через плюсик в атака да плюс равно нас есть переменная она тип данных строка А и он от есть цикл выполняется миллион раз И вот в этом цикле Мы выполняем операцию текущая строка плюс равно какое-то значение или даже собственное значение мне миллион раз Это
00:28:42 - 00:30:08
честная грустно за память нашу потому что в таком случае мы действительно теряем кучу памяти каждый контент нации это создание нового объекта соответствии с тем как это происходит И тем самым каждый раз каждый цикл мы создаем новые новые объекты она наращивается и нам Я не знаю его метод Ну правильно Абсолютно верно ответил что создается так называемая intermedia string то есть промежуточная строка достигает получаемая в процессе нашего движения где мы хотим оказаться и ты искал таким образом Stream Builder решает эту
00:29:34 - 00:30:53
проблему ведь вот у меня помню вопрос всегда вот такой был когда я начинал вот я вызываю метод Open Я все равно в этот метод opent отправляю туда строку что же там такое происходит и почему конкатация плохо острин Билдер принимает строку Я все равно эту строку В итоге создаю Она вроде как и промежуточная но создается Так в чем же все-таки ответ вот я так точно такой же вопрос задавал и сам себе но я пришел к выводу что он это как-то делает через бойкот он как-то в обход вот этой системы как-то под капотом это
00:30:15 - 00:31:24
честно я не знаю но я помню что это через байт-код на вход он просто берет есть прямой путь она так Через горы обошёл такой я Я буду так я понял нас на самом деле ты прав и не прав то есть Да действительно байт-код и оптимизация есть но смысл заключается в том что у стринг билдера под капотом находится массив Байков по сути можем сказать что это массив сим прямо сейчас массив байтиков Разумеется Да когда Мы выполняем метод opent и Передаем туда реальную строку она конечно же добавит мы этого не можем избежать потому что
00:30:50 - 00:32:00
это литеральное создание данного экземпляра типа данных string но смысл в том что мы не создаем промежуточную строку путем соединения существующий с той к которой мы стремимся вот эти промежутки называется intermedia Stream Builder в свою очередь под капотом как я уже отметил содержит массив он просто все это конвертирует все данные в минимальную единицу то есть пальчики и затем наполняет массив Разумеется промежуточные строки таким образом не создается А когда в конечном итоге нужно создать строку то есть выполнить условно
00:31:25 - 00:32:35
метод Билд нашего шаблона проектирования он просто конвертирует массив байтиков уже в строку и мы получаем финальный большой может быть а хорошо расскажи пожалуйста в чем разница между стримбилдер и стринг бафф но стринг Билдер и стримбафер Но баффер он же синхронизированный то есть медленный он просто медленнее чем Stream Builder и плюс у него синхронизация для многопоточности идет а если мы уберем синхронизацию Stream Builder быстрее чем Stream баффер или или все-таки нет честно честно Так наверное не скажу Ну
00:32:00 - 00:33:26
если убрать синхронизацию наверно наверно да это возможно знаешь тоже самый вопрос разницу вектора и реалистата там же что же и синхронизации вроде Похожие и работает также но тоже Вектор медленнее чем релиз Я думаю Наверное да Будет медленнее чем Стрим Билдер на самом деле они одинаковы разница только в том что один синхронизированный другой нет это как раз это как раз описано в книге эффективная Java Кстати что нет смысла создавать класс который умеет слишком много вещей которые не в каждом случае
00:32:45 - 00:34:11
нам пригодятся как раз Вектор тому явное доказательство он синхронизированный разумеется это нам бьет по производительности вопрос главный Нужна ли нам всегда синхронизация как раз в блоке книги эффективные посвященной многопоточности там это описывается как раз это хороший пример хорошей архитектуры дизайн то есть есть класс который на все случаи жизни а есть класс Для обеспечения многопоточности хорошо здорово Мне нравится вообще на самом деле ответил очень здорово молодец [музыка] Итак давай тогда займемся коллекциями
00:33:28 - 00:34:45
можешь кратко описать иерархию коллекцию фреймворк в Ну все началось и terrable интерфейс потом пошел collections Collection потом у нас есть quid Set и отдельно у нас там вправо сторонке стоят но они значение не подходит немножечко Круто Слушай а почему мап стоит реально обособленно что там не так со значением Ну у нас обычно все вот эти коллекции которые у нас идут Collection У нас они реализованы с одним значением то есть игнорируется только по одному значению как бы два значения ключи и поэтому
00:34:07 - 00:35:40
итерация там немножечко другая А разве мы не можем мы же знаем что если забегая вперед дженерики что все коллекции Genesis Ну то есть кто нам мешает в коллекции хранить там допустим стринг Ну то есть коллекцию Stream of или коллекцию объектов ключ значения Тогда в чем тогда разница между Map и не вижу Ну то есть так храню коллекция значения атомарная или храню значение атомарная которая под капотом состоит из двух мини значений чем тогда разница Ну мне кажется мы по сути выполняем двойную работу и
00:34:54 - 00:36:14
засовываем нашу мапулист и это мы одну коллекцию во вторую Засуну Я думаю это как-то ну немножечко не неразумно и поэтому для каждой задачи должна быть своей реализации считаю Мапа была одна задача то есть значение и Вот его реализация но смотри Но есть мы можем идти в сторону упрощения предположим вот у нас есть вот выбор да Или поддерживать Има и Collection или поддерживать Collection Но вот опять возвращаясь к начальному варианту ведь это дженнер то есть обобщенный тип данных мы можем хранить
00:35:34 - 00:36:43
коллекцию из строк или я могу создать специфический класс который будет представлять из себя допустим N3 который в мат есть то есть ключ и значение и также написать и тогда вот этот Collection 3 Разве он не может заменить интерфейс в этом случае о такой сложный коварный вопрос Я думаю я думаю нет Я думаю нет если просто исходя из таких слов если мы так легко это можно реализовать зачем тогда была создана мапа но я тебе могу сказать Вот есть линки лист все знают эту коллекцию реализацию и никто практически
00:36:09 - 00:37:33
не пользуется и даже создатель этой коллекции как раз сказал что я не знаю зачем я создал Ведь я реально практически никто не пользуются хотя есть исключительно ситуации Я уже пользовался этим исключительно ситуации У меня есть несколько кейсов когда применял и все-таки мап существует Так в чем же причина существования как структуры данных и Collection как структуры данных а ну наверное Исходя из этого у нас есть одно значение только в Collection то есть они отталкиваются только одного значения и всех методы связаны только с
00:36:51 - 00:38:03
этим одним значением если использовать методы мапы у неё Они разделяются антре сету который может распределить нам и отдельно и ключи и значение то есть и различные камеры по по ключу либо павеле и так далее То есть я думаю исходя из метро потому что там реализация всех методов идет к одному значению то есть мы делаем что-то с одним значением А тут у нас ну два значения Смотри я могу привести реальный пример ведь есть интерфейс Collection есть интерфейс в интерфейс есть метод которого нет Collection и более того но
00:37:30 - 00:38:44
это очень такое специфический опять же случае то есть Можем кто нам мешает сделать специфический интерфейс назвать N3 или как-то так Да и расширится от интерфейса Collection и внутри этого дополнительный интерфейса добавить методов которых ты говорил которые будут ориентированы на объект который хранит под капотом пару почему бы нет я все-таки думаю из-за того что у нас есть уже какая-то логика реализации У нас есть какая-то структура данных то есть аналогически там получается нас из этой Куала или они
00:38:07 - 00:39:26
все по одному значению два значения я считаю Они просто И вынесли отдельно как Ну знаешь как один рот чтобы его не портит вот нашим двоичными значениями Окей мухи отдельно котлеты отдельно хорошо резон но недостаточно если я тебе задам другой вопрос В какой основное призвание интерфейсом Map или какой основное призвание структуры данных словарь особенно если мы говорим про хеш-функцию то есть но мы точнее таблицу Прошу прощения мы создаем получается такой CSS уникальных значений в виде ключа То есть
00:38:47 - 00:40:18
если коду которая определяет это Наверное от этого как-то нужно оттолкнуться преимущество этого подхода но вот если опять же вдаваясь в структуру теорию структур данных и опять же почему не может Collection заменить Map вот все-таки в чем основное преимущество интерфейса или его базовой структуры словарь или если совсем в реализации Ну я исхожу из того что там используется Хеш код то есть наш ранее обсуждаемый контракт и по сути выполняется функция это превращение нас объекта не фиксированной длины цифровой
00:39:37 - 00:41:13
объект фиксированный то есть и работа уже непосредственно с этим ментом То есть это ускорение работы потому что намного проще работать с нашими цифрами с объектами в виде цифр чем самими там строками другими объектами Мы представляем наш объект виде их Шкода в виде числа по Исходя из этого Шкода мы ищем Бакет по этому бакету моего ложем И если нам нужно то есть мы его ложим еще на первое место там у нас скоростью один и по ГЭТ У нас тоже Один потому что мы все-таки работаем с цифрами и у нас скорость туда и назад я не говорю про
00:40:28 - 00:41:41
внутреннюю это двух связанный список то чтобы Слушай прям классно описал Действительно это хорошее замечание что компьютер отлично работает только с цифрами но на самом деле если подвести итог основная задача Хеш таблицы заключается в предоставлении константного времени доступа к операции и соответственно Collection по своей причине этого дать нам не может поскольку интерфейс Collection ориентирован на итерацию по этим элементам самым она обладает действительно методом gett который по ключу как раз и дает нам
00:41:05 - 00:42:25
возможность получить за константное время наш хранимый объект соответствующий по сути разница между Collection и мат только в одном это две структуры данных которые где-то похоже между собой но скорость их работы или скорость выполнения алгоритмов полностью отличается Здорово тут разобрались тогда давай дальше нужно заговорили и начал описывать Как устроена в Джаве Давай поговорим для начала как он внутри устроен Ты уже начал с бакетов Давай начнем Что такое бакеты что они себя представляют Ну у
00:41:45 - 00:42:59
нас получается хашмапы такой массив с бакетов каждый Бакета двух связанный список такой как бы который также работает у нас есть ссылка на У нас есть просто ссылка на первое значение и в этой в этом первом значении у нас хранится ссылка на второе то есть то же самое linked по принципу и Фишка в этом я считаю Потому что при добавлении на первый элемент у нас всегда идет константные Поэтому используется двух связанный список и мы всегда добавляем наши новые элементы в мапекет Мы очень всегда на первый при этом у нас выполняется
00:42:21 - 00:43:33
хеш-код ранее обсуждаемый который превращает объект в цифровой int и сравнивается не объекты Ну так как у нас был контракт икрылся У нас есть коллизия как нас просто объекты Когда у нас хэш код говорит что у нас объекты так сказать хэш-код сейчас когда у нас код говорит что у нас не совпадает с объекты объектов не совпадает то объект у нас разные это так А если кот совпадает это не значит что нас объекты еще одинаково нам нужно включить ecloss потому что у нас что значение и она ограничена объекты могут быть разные это даже
00:42:58 - 00:44:29
пример мы можем создать два разных класса на просто типа данных там одинаковые написать и конструктор тоже самое данные записать у нас будет какой-то классный абсолютно два разных класса и скажет что они разные но сказать что одинаковых Нам нужен проверить сами объекты уже Мы обсуждали По каким критериям и также проверить все поля этих объектов и если объекты у нас одинаковые то он просто перезапишет wellue этого этого объекта в Личном списке также и есть они не одинаковые просто на первый элемент
00:43:43 - 00:45:05
добавить тем самым в Ленте если добавлять первый элемент это о константное и также хочу добавить Я помню восьмой завис на поменяли этот связанный список он там супер мега трансформер в 3 ноду трансформируется после 8 этих элементов и он потом превращается в эту природы у него скорость Поэтому да еще баки ты Мы можем поставить в матке который будет определять нашу нагрузку на бакеты Ну там по умолчанию 075 тем самым такая золотая середина мы можем например выбрать памяти больше выделять но тем самым у нас будет скорость быстрее или
00:44:25 - 00:45:48
памяти меньше скорости вот так хорошо Здорово слушай а что вот этот лот-фактор он принципе означает чем его основная идея То есть как он работает расширение Бакета Вроде я точно не помню там иди 16 бакетов в начальных плюс 1 идет одна и дальше если мы их просто забиваем то они автоматически от исходя из нашего который мы указали он будет расширяться и там а для поддержания своей работоспособности прижённо резона то есть по сути Это нашло сколько мы можем хранить элементов до сих пор пока не расширим общий объем и
00:45:06 - 00:46:37
это золотая середина 075 в разных языках программирования и реализации Хорошо давай поговорим про такую штуку которая называется итератор зачем она нам нужна во-первых итератор Нам нужен для итерации как бы это странно не звучало нам нужно кооперироваться по нашим массивам или листам и если это ж у нас и terrable позволяет оперироваться по коллекции нашим нормальный интегрироваться и итератор это интерфейс который имеет в себе методы различные как NEX NEX который мы должны организовать они класс которые
00:45:51 - 00:47:19
реализуют он может получается италироваться итерации мы просто используем эти методы для определения как речь только немножечко покруче и сюда надо добавить чтоб использовать вот этот вторично нужно что вот этот был реализовать чтобы использовать хорошо а Слышал что-то про такое как фаст Fast Fail быстрая ошибка какая-то или Но вообще да самая быстрая ошибка на диком западе это Exception или nexection это проблема связана представим себе ситуацию вот я создал себе коллекцию работаю с ней и в процессе работы с этой коллекции вдруг я
00:46:36 - 00:48:21
начинаю удалять из этой же коллекции элементы и тут у меня произошла проблема во время выполнения программы что это за проблема я понял я понял к чему такое ты клонишь К тому что мы в обычном фри че не можем удалять наши элементы потому что мы изменяем нашу коллекцию разменяем ее размер Мы просто ломаем наш сам цикл айтератор Да оператор обладает классным методом Remove и он просто удаляет элемент который и позволяет нам вот эту ошибку fastle Вот это избежать я понял Да верно А какой будет исключение
00:47:28 - 00:48:40
выброшено когда повстречаешь вот эту ошибку думаю многие с ним сталкивались честно честно я не я не вспомню наверное и многие путают многопоточность Хотя это тоже название имеет на самом деле это резона потому что коллекцию могут изменять сразу Одновременно несколько потоков и очень с другой стороны основная идея не только подточном использовании а в том что как-то странно видоизменять структуру коллекций с которой ты сейчас работаешь пока ты по ней и оперируешься поскольку будет непредвиденный результат конечном
00:48:03 - 00:49:29
итоге здорово тогда здесь и мы можем закрыть Давай поговорим про Стрим API отдельным пунктом коллекции Я думал задаст этот вопрос Но Стрим опять очень классная штука не знаю Вот лично мне ее обожаю может решить любую задачу с коллекцией может практически любую и решить Это в одну строку Это пришел восьмой Java тональный интерфейсом который очень там используется и лям до выражение по сути Стрим API это способ решения способ даже не способ это поток данных эта коллекция мы Превращаем ее в поток данных по которым Мы
00:48:51 - 00:50:15
оперируемся выполняем различные задачи которые фильтрация изменения Там просто пропустить ограничить количество значений сгруппировать и так далее там очень очень много интересных методов и мы с ними работаем тем самым мы упрощаем написание кода с помощью функциональных интерфейсов такие как function такие как predacate мы также упрощаем работу с этим и мы реализации буквально вот в одну строку огромного куска кода то есть Очень классно и мы Еще плюс к тому что мы не изменяем изначально массив мы делаем Это с
00:49:41 - 00:51:02
копиями создаем копию то есть мы никак ее не трогаем супер функциональный интерфейс Что такое функциональный интерфейс функциональный интерфейс который обладает одним абстрактным методом только одним кто может обладать также дефолтные методами которые могут тоже использоваться там Я кстати смотрел реализации этого факта на него там несколько то у них у всех там есть реализации дефолтных методов которые используются впоследствии работы и нужен вот этот функциональный интерфейс для работы в лям ты выражения лямдо
00:50:22 - 00:51:28
выражения Просто может реализовать его буквально там в 33 слова и эти лямблиш опять же используется в стримах и Как пример функциональных я уже говорил function который используется Кит который используется в фильтре также есть сопла и который поставщик возвращает объект Это он вроде в общем надо использовать ничего не возвращает Окей Смотри я знаю и в том числе говорят было бы модно ее ставить на свои функциональный интерфейс который мы создаем В чем смысл этой аннотации и Могу ли я ее избежать
00:50:56 - 00:52:08
предположим если создал класс Я говорю это функциональный интерфейс но там нету аннотации то будет ли ошибка компиляция или все будет Ну во-первых можем создать и без аннотации но аннотация Я помню что мы можем ее поставить она будет контролировать это то же самое райт которая наверное просто ставится для правильности пример собирает правильности определение тоже метода что мы хотим правильно ввели параметры этого же метода То есть я думаю в таком смысле мы можем создать обычный интерфейс абстрактный будет
00:51:52 - 00:53:06
функциональные если будет иметь один метод Но насчет этого я не знаю как она под капотом потому что например если King какой-то там аннотация на сто процентов где-то использовать где-то там вы через рефлексии они 10 раз и куда-то закинули используясь а то думаю нет но тогда тут вопрос подвохом кому она кому это аннотация уперлась кому она реально важна я думаю наверное разработчикам чтобы они понимали что это интерфейс его нельзя дополнять имеем только один метод то есть не надо вот смотришь функциональный интерфейс видно
00:52:29 - 00:53:43
написано слово Все больше не твоего закрою согласен но если скажу что разработчик стоит на втором месте Кто на первом наш код не видит он же только пользуется нашими плодами может сама Java GM может как-то А если близко к Джаве но не Джим кто нас там еще есть до того как живем что-то этот коллектор мусор Нет не собирается ну ладно подскажу компилятор Потому что если вдруг ты создашь дополнительный метод абстрактный то это аннотация позволит жало компилятору не собрать код конечном итоге То есть он проверит что
00:53:08 - 00:54:27
данный класс аннотирован как функциональный интерфейс но не соответствует заявленной сигнатуре данного типа и соответственно такой байт-код жизни права на жизни это пришло они из этого класса хорошо не рассчитана скажи вот по поводу Стрим API В чем различие методов мэп и метода Flat классная тоже вот Google недавно потому что хотел вспомнить эти стримы API они очень классные но их очень быстро забываешь если долго не заходите ничего там не писать то разница в том что мы просто Превращаем какой-то объект другой
00:53:54 - 00:55:25
объект то есть нас объектом и Побег бы его приобретете позволяет нам обратить один объект в поток объектов то есть мы его продолжаем Я помню хорошие примеры были это когда мы работаем с объектом которого есть коллекция других объектов которые мы должны достать нам нужно по-любому потому что мы будем работать уже с коллекцией вот этих объектов внутри нашего объекта такая связанная у нас получается использовать этот поток данных Окей хорошо тогда разрабатывает Лол пример у меня вот вопрос предположим У нас есть Стрим и у
00:54:47 - 00:56:12
него есть внутри этих объектов как тоже сказал есть свое свойство которое является какой-то другой коллекции Разумеется у каждого объекта из стрима будет эта коллекция когда я вызову флет мэп в конечном итоге и какой будет результат после вызова Flat Map если я хотел бы поработать с этими вложенными коллекциями отдельно мы получается собираем наши коллекции То есть у нас есть набор элементов Ну допустим там 5 5 человек у них вот этих пятерых человек есть какой-то Ну допустим какие-то оценки Да там
00:55:29 - 00:56:49
и у каждого из этих человек есть такие цены когда мы используем Просто теперь перестраиваемся на вот эти оценки у нас тех поток со только из-за то есть пять оценок пятница 2 3 4 5 Мы уже работаем как с потоком как будто мы объединили все в одну кучу и использовали из прямых к ним Вроде так то есть по сути Flat позволяет нам трансформировать один Стрим в абсолютно другой и перейти на другую структуру данных если изначально Мы работали с коллекцией студентов то после применения и сбора всех оценок этих коллекций
00:56:11 - 00:57:26
студентов мы уже будем работать с коллекцией оценок этих самых студентов хорошо двигаемся тогда дальше поговорим про такой интересный класс или набор классов три Скажи пожалуйста какие есть базовые реализации базовой реализации это Стрим output Стрим Input или Input Input Stream базовый это файл Input Stream буфер потому что импуль Стрим Я вот тут Стрим это все-таки абстракция это классно и получается Я помню что он используется при там же вот этот декоратор используется при работе с этими данными
00:56:50 - 00:58:28
файлы буфер буфер Вроде нет Хорошо хорошо да возможно я возможно так бы вспомнил если бы увидел знаешь подсказку в интерьере Там просто списочек Ну сегодня я буду тебе вместо подсказки в Intel C1 тогда Какая самая минимальная единица для работы с потоком имеют соответственно какой Стрим у нас будет байт Да он называется байтер и Стрим то есть по сути это наш массив байтиков хорошо здорово скажи пожалуйста вот есть такой пакет или в чем его прогрессивность вообще его смысл зачем его придумаешь нельзя было обойтись
00:57:42 - 00:59:28
помню разницу его и Нил и там нас потоки потоки данных какие-то там файлы в прямой поток данных а не это мы их делаем через баффер то через буфер подгрузочку Мы берем буфер connectem сяк канал мы это через буфер Понемногу подгружаем Я помню как пример был как видос на YouTube Если мы смотрим то у нас есть там буферизация тоже самое происходит вроде смотри тут такой удар ниже пояса ты сказал буфер Да но есть там баффер действительно Но ведь и в обычном стриме есть буферизированные потоки Тогда все-таки в чем смысл
00:59:02 - 01:00:32
наверное Ну виде данных которые они передаются Ну то есть если там байт код где-то тут я тоже Мы наверно там тоже в байт коде Они придают Не ну давай Так в чем Вот был пакет Точнее он не был он есть пакет Input output Он до сих используется и там есть баффер в чем смысл буферизированных потоков тем что они сначала подгружают буфер с буфера дают получается на клиент и потом они повторяют тем самым тем самым она создается впечатление такой постоянно стильно то есть скорости постоянность то есть нас не рывками она подгружают А в
00:59:50 - 01:01:14
чем преимущество буферизации то есть но блин Раньше я взял собрал данные отправил их на диск сохранил но там Я имею файл какой-то появились буферы но вроде как собрал буферы обратно отправил на диск в чем буфер все-таки какая-то область памяти которая хранить эти данные на какой-то период времени из-за этого как-то из-за того что они там дополнительно могут сохраняться и блин реально смысл это все Я тоже думаю сейчас какой смысл что нам хранить в ведре или сразу отправлять это здоровый Чан с песком то
01:00:34 - 01:01:56
есть какой мы можем как-то их обработать дополни Может они какой-то дополнительного переработку проходит эти байки может они как-то преобразовываться в буфере Нет я не смущает ситуацию что вот у нас есть большой Чан с песком или он может быть заполнен И я такой наполнил еще все-таки вам Молодцы и потом нам говорят вот туда метров за 500 и все-таки блин там три тонны песка как мы это все будем сейчас тянуть что здесь не так [музыка] который давал Это задание Наверное это позволит вернуться то есть
01:01:17 - 01:02:40
мы не все файлы сразу придаем Возможно Возможно мы их можем как-то перепределить в другое направление в другой канал как-то но ты очень близко сказал действительно правда мы говорим о том что нести 3 тонны песка единоразовые с точки А в точку б Это очень тяжело из нашей жизни Разумеется проще заиметь 10 человек и передавать ведро 100 грамм каждая Да и делать это наполнили это ведро передали наполнили ведро перед вместо 100 грамм это очень условно связаться там не три тонны до скажем что ведро из 10
01:02:08 - 01:03:23
килограмм наполнил 10 отнес наполнил 10 отнес таким образом буферы позволяет нам производительность повысить Потому что если мы говорим про работу с диском передать данные особенно большие данные из нашей энки соответственно через все пройти так далее спуститься на сам диск довольно таки обратная операция вместо этого существует буфер мы его наполняем наполнили каким-то объемом как только он готов он отправляется и наполняется следующий буфер Ну то есть он по сути опустошается и зано начинает наполняться
01:02:46 - 01:03:53
по сути мы одно порцию отправляем единоразово Но это повышает нам эффективность Но тогда здесь вопрос тут мы разобрались вроде с буферами из пакета но а чё за буфер из пакета на Ну вроде как ничего не придумали нового в таком случае там буферы здесь буферы что не так Я думаю не как-то более умного оптимизированы вряд ли что-то добавляли не оптимизировано Ты вспомнил такое волшебное слово которое называется Channel каналы какие-то чем преимущества Они вроде как-то направляет то ли а я не помню там есть три точно три
01:03:19 - 01:04:43
каких-то ключевых То есть клиент канал и буфер вроде если я не ошибаюсь и они вместе с собой реализуют вот эту так сказать график доставки нашего песка то есть нас начал идет канал который подключается напрямую к нашему файлу забирают данное через свой канал передает буферу и буфер уже передает вроде клиенту либо немножечко канал другое место но я точно это не помню возможно как-то все-таки оптимизацию добавляет этот канал и сто процентов потому что у нас только оптимизация на самом деле все проще пакеты пакет
01:04:02 - 01:05:25
naio помимо там разнообразных утилитных классов которые облегчат и реально усовершенствовать работу с файловой системой не только он позволил нам завладеть неблокирующими операциями вот эти самые каналы это есть та самая возможность не блокирующих операций Когда мы можем выделить какой-то определенный объем работы отвечающий за соответственно обработку данных другой Объем работы мы можем отправить на запись этих данных 3 на отправку и по сути каждый из этих объем работ отвечает за это и он минимально простаивает Ведь
01:04:47 - 01:06:06
если мы говорим о блокирующих операциях это в большей степени про многопоточку Разумеется когда потоки создаем пока один поток выполняется все по цепочке его ожидает по сути это синхронизация синхронность когда мы говорим Не блокирующую операцию это отсутствие синхрон то есть мы можем спокойно Отправить куда-то данные пока сигнал обратно не пришел что пора с ними поработать мы можем заняться чем-нибудь более полезным по сути эффективно использовать ресурсы выделяемые для GM То есть это по сути не блокирующие
01:05:27 - 01:06:33
операции канал именно это нам и обеспечивает ну здесь здорово Это такая довольно таки Широкая тема Я думаю что мы можем двинуться в более простую тему и Давай поговорим про исключения можешь рассказать про иерархию исключений Да у нас началась его дальнейшей реализации Error и это ошибки после которых дальнейшая работа программы просто Физически невозможно она просто не может работать а Exception те которые Ну еще они там делятся на чек точек получается человек который у нас проверяется которое Мы обязаны
01:06:00 - 01:07:23
обработать с помощью или срок все натуры выкинуть Это наследуется от Exception и есть фантаймс эксепшен это Анчик который не проверяем и они по сути возникают во время рантайма извлечься вопрос В чем все-таки отличие runtime мы знаем что есть у нас подразумеваем когда программа выполняется то есть ошибки которые возникают которые являются наследниками runtimexection они возникают Только время выполнения программы А другие возникают где-то в другом оно возникает Ну Разница в том что мы первое чек Мы обязаны их обработать
01:06:42 - 01:08:10
потому что нам компилятор просто не даст запустить код он просто капел Exception То есть он невозможно Как пример это те же самые ионио все любимые также туда многопоточность с потоками просто их не можем ожидать они могут быть они могут не быть и мы можем их как-то где-то там обработать каждый постоянно треки можно если кот там где-то может выбросить ошибку туда и кидать она более как-то благоразумно рантам непредсказуем Окей хорошо подскажи пожалуйста ты говоришь обработать исключения какой-то тратить
01:07:31 - 01:09:04
вообще как это работает в какой форме мы можем в ходе его представлять Ну есть ресурсами есть без ресурсов также у нас есть блок файл который выполняет Ключевое завершение нас по сути открываем блок Try записываем определенный код который может вызвать ошибку потом соответственно может возникнуть в блоке то можем ее либо по иерархи выше поймать также мы его обрабатываем то как мы хотим например может влог записать Может просто новую другую Exception и так далее там зависимости от логики и файл блок который мы реализуем то есть
01:08:20 - 01:09:45
выполняется в любом случае Ну конечно если у нас там живем там память кончится но я не знаю умрет ничего например какую-то сессию закрыть какой-то Райдер закрытие окей Окей А зачем тогда нужен траевой За ресурсы снова вроде как бы резонная штука Но чем его смысл и как он работает по сути мы туда придаем Объект который мы можем закрыть также сама сессию тот же самый Rider Мы просто его Передаем и нам не нужен блок фай на который будет эту то есть этот объект закрывать то есть на эту сессию например мне будет
01:09:05 - 01:10:26
закрывать она автоматически на закроется по завершению Окей А может быть такое что все-таки в Trike Catch вы За ресурсы или просто есть блок Final это вообще возможно или они просто его исключили когда создали эту конструкцию есть я думаю есть потому что можем не только там просто в ресурсах мы ограничены в определенном можно вообще какой-то каунтер Я не знаю нулю или еще что-то Ну то есть вообще не связано с Окей хорошо хорошо резонно Какой основной условие использование trive из ресурсов оно же не просто так работает Я
01:09:47 - 01:11:13
вот тоже думал над этим вопросом я почему-то склоняюсь должен быть какой-то либо интерфейс с одним методом либо определенный метод под названию Я думаю это какой-то Close сто процентов должен быть либо интерфейс который позволяет этот Клаус Ну потому что то что я наблюдал обычно это туда можно поместить все У кого есть этот же метод closs который что-то закрывается Я думаю Абсолютно верно на самом деле он работает с интерфейсом автоклозу был Это значит что там присутствует сигнатуре у интерфейса метод
01:10:30 - 01:11:39
и все структуры все ресурсы которые хотят быть самозакрываемыми при помощи траевой ресурс Они обязаны его реализовать Иначе просто это не будет работать на уровне компиляции по сути будет точно такая же ошибка как И если бы я бы захотел бы что-то ставить в for each что не реализует интерфейс и terrable здорово здесь разобрались кстати про вот этот Alto Close он же вроде Spring шестом то что вот недавно вышел и будьте третьем они там джипаш вроде добавили Если не ошибаюсь он теперь сам может закрывать
01:11:04 - 01:12:24
себя в этот если на самом деле очень много чего они туда добавляют то есть Оно не стоит на месте и все потенциальные вещь допустим тот же самый Connection из gbc он тоже везут интерфейс вполне [музыка] Давай обсудим с тобой рефлексию Расскажи пожалуйста чем основная идея рефлексии [музыка] reflection 5 позволяет нам получить доступ к классу позволяет получить доступ к классы исходя из класса мы можем использовать конструктор переменные даже правит переменные методы мы можем их вызвать то есть мы можем так
01:11:44 - 01:13:12
сказать из Стороны также сюда и аннотации то есть исходя из аннотации можно получить целый класс либо получить целый метод и параметры метода исходя из этих всех параметров например спринг тот же самый или Аспект на ориентированное программирование работает то есть мы с помощью Вот reflection и получаем все эти данные и можем например как в Аспект G мы можем логировать какую-то служебную логику и так далее То есть очень много не используется Окей А ты сказал такую вещь что можно получить доступ к
01:12:30 - 01:13:44
приватным переменным разве это не нарушение инкапсуляции разве нет защиты от этого никакой но мы можем получить доступ Но мы же так сказать можем не посмотреть кто у нас там хранится но мы не можем него там изменить Вроде я точно не помню А если можем А если можем то наверное А что произойдет если реально Мы попытаемся изменить значение приватный перемен Ну во-первых чтобы туда вообще добраться нам надо там доступ поставить Если не ошибаюсь И если мы так сделаем Я думаю то если например кто-то перед нами
01:13:07 - 01:14:32
там Вчера делал какую-то часть кода у них классе работает Молодец заслуженный что-то там подкорректировали свою часть У нас тоже все супер все работает на следующий день пришел что-то не работает потому что все-таки наручник абсолюция изменили какой-то до перемены какие-то данные И тем самым объект уже не сам за себя отвечает он не сам как сказать контролируется состояние А мы уже просто стараемся в это безнаказанно кей на самом деле действительно мы можем изменить значение мы используем этот метод называется Set accessible
01:13:51 - 01:15:12
этот момент в этой части кода Разумеется мы можем работать с его приватными членами данном случае мы говорим про конструктор в том числе про свойства и значение менять можно в том числе мы можем вызывать приватный конструктор создавать поэтому все это возможно Разумеется нужно пользоваться этим с умом но у меня вот вопрос можешь привести реальный пример не аннотацию Где бы мы применяли бы о рефлексию который самый и Close когда мы getclass получаем и уже это тоже самое эффективное мы получили этот класс уже
01:14:36 - 01:16:04
знаем что он что он есть хотя там с какой-то джаб этом Туле 11 плюс у нас там instance of как-то поменяли теперь Там обычный слов делает как-то там закручена но есть у нас возможности Есть рефлексия познается через разные интерфейсе в том числе У нас есть асаина был форм метод есть конструктор Потом в 13 жаре появился паттерн Но это скорее улучшение чем изменение того как он реально работает что данный объект является типом соответствующего Он позволяет проверить это утверждение и сразу получить продаж то есть мы сразу
01:15:19 - 01:16:53
же здесь можем создать переменную которая будет доступна с этим типом данных но только в этой части условий то есть изолированная область с безопасным приведением типа ну то есть с одной стороны код сократили с другой стороны безопасность Хорошо скажи пожалуйста вот ты говоришь про аннотацию Spring Какая вообще польза от этих аннотаций Казалось бы какой-то синтаксический сахар навешиваем что-то вообще реально какая польза тут я думаю разработчик какой-то из немножечко бы огорчился такие потому что
01:16:09 - 01:17:22
с помощью аннотации мы можем получить все действительно мы можем в зависимости от аннотации мы можем вести туда значение различные мы можем аннотация создать исходя из других аннотаций то есть мы можем смесь аннотации создать исходя из этой аннотации мы получаем какие-то данные то есть то же самое Джим и ставим какую-то аннотацию мы к ней там через год при и через этот паренькад настраиваем наши два из то есть мы уже работаем по сути Санат с помощью аннотации Но мы с этой нотации получаем уже данные этого метода либо какого-то
01:16:45 - 01:17:53
класса который мы хотим поймать и уже выполняем различные действия с помощью рефлексии то есть здоровье открыто Окей хорошо убедил Ты вспомнил про такую штуку как аспекты какой-то там два из Поинт Как можешь объяснить в чем разница в аспектах между чем чего мы добиваемся посредством него ну нас аспекты получается вообще но нацелены на так сказать отделение бизнес логики служебной логики то есть мы нашу служебную логику такую как логгер тот же самый либо проверка либо фиксация чего-то либо вроде там тоже
01:17:19 - 01:18:54
какие-то элементы уходят сюда и мы через аспекты можем создать pointcut это так сказать точка доступа то есть мы обозначаем сейчас Paint Cut наши отслеживаемые методы которые мы хотим например поймать и advice это исходя из названия просто совет То есть как мы будем советовать им обрабатывать там есть различные методы различные аннотации это у нас befo потом автор авторы залп и раунд если это нотации в любом случае Перед каждым методом потом автостроил только после выпадения ошибки в нужном на методе освоилась на poincad
01:18:08 - 01:19:35
но мы условия мы не можем это нам работать то есть мы не можем взять это работает мы просто можем ее зафиксировать но мы не можем так сказать пропустить авторизал Когда у нас возвращается результат то есть мы метод мы его можем изменить и можем изменить отрезал ты вернуть Вообще другой то есть по сути Мы представляем собой как такая промежуточный элемент между связными то есть нас метод придает значение другому там объекту мы просто посидим между ними стали Улыбнулись смотри если привести Вот пример вот ты
01:18:52 - 01:20:11
говоришь логирование почему логирование очень часто связывается и еще раз связаться с чем с аспектами Почему связывается логирование наверное потому что мы можем просто легко перехватить данные То есть даже не прекратить мы можем просто посредством Спектр хватать параметры методов их названия и просто легко логировать Мы можем написать один метод который будет автоматически хватать на все нам не нужно каждый раз прописывать вот тут у нас это в этом методе это в третьем методе это в один метод резона полностью согласен Здорово Хорошо
01:19:35 - 01:21:03
будем тогда двигаться дальше [музыка] Итак давай поговорим про SQL и традиционно В чем выражается смысл что это такое и почему новости от него отличается [музыка] это у нас авиационные базы данных это у нас все сущности представлены в виде таблиц и у нас есть название этой таблицы есть Колонки есть руки этой таблицы Мы работаем последствии с таблицами мы их Соединяем их Ну то есть мы их селектим Джо и какие-то девушки с них создаем не знаю Там триггеры и так далее это Документ и нас все в одном так сказать
01:20:18 - 01:21:47
объект в объекте такая Наследие иерархия получается и Москве или отмечается тем что он хранит все это в одном таком документе большом но он его распределяет правильно И если так взять плюс и минусы Мне кажется зависимости от бизнес задачи они отличаются можно и тот и тот использует часто используется что и авиационное что и не Революционная база Окей А можешь привести пример реляционной базы данных и не реляционным название это этот [музыка] Microsoft Office он называется SQL сервер или МС но это не принципиально в контексте
01:21:11 - 01:22:45
Понятно Здорово слушай вот при создании таблиц постоянно разговаривать про какие-то концентрики ограничения что вообще за ограничение смысл Какие бывают это если я не ошибаюсь это у нас это у нас флоренки это у нас также нотнул и если есть такой точно не помню это что-то смысл Ну то есть звучит Ну для соблюдения то есть они нужны Для такой все-таки мы используем таблицы нас таблицы почему-то должны быть сравнимы они должны как-то использовать индекс должны как-то перечисляться и должны как-то храниться правильно то есть и
01:22:18 - 01:23:39
связи между ними должны соответственно быть И для этого у нас используется те же самые поринки и праведники которые позволяют нам правильно италироваться даже самые индекс создать и например использовать при поиске намного быстрее Ну кроме как правильно реки еще что-нибудь защита на еще один может дефолт если есть Почему нет я бы не назвал бы это прям совсем ограничением Но почему нет но скорее он скорее дает нам возможность Хотя когда мы говорим про дефолт значение если Мы попытаемся что-то но когда поле
01:23:11 - 01:24:30
существующий таблицу попытаемся добавить изменить то там как раз дефолт может нам и понадобиться поскольку уже что-то там может присутствовать хорошо Ну я добавил вместо дефолт на самом деле здесь сколько более применяемые наверное чек позволяет Хорошо тогда двигаемся дальше ты говоришь про какую-то скорость доступа чем выражается скорость или чем достигается скорость доступа скорость операции Я бы обобщил бы к сложности это их операций и в зависимости от методов которые используются для получения этих данных и
01:24:02 - 01:25:18
зависимости от той же самой BD который мы используем тот же самый Майский L Oracle и этот Microsoft он немножечко разные Я просто помню хорошие были сравнения различных методов тех же самых методов тех же самых задач но скорость была абсолютно разная у всех то есть одной кто-то другой со вторым лучше но если все-таки отпрыгнуть детали реализации конкретных таблиц конкретных баз или способ вернее при помощи чего бы сказал мы позволяем повышать скорость выборки допустим индекс индекс Какие виды индексов Ты знаешь
01:24:43 - 01:26:21
[музыка] айтишники то нам нужно немножечко назад вернуться Окей хорошо тогда здесь вопрос праймерики какими ограничениями обладает он должен быть атомарным но и уникальным он должен быть один на одну этот на колонку не колонка на одну таблицу и также камеры какие-то таблицы должен быть и они не должны быть повторяемыми между строками то есть одна строка обладает только одним идентичным потому что будет уже это будет что-то странно если мы по одному айтишник получим там 10 каких-то элементов безусловно
01:26:18 - 01:27:46
А какой еще есть ограничение а ну то что он может быть любым он даже его даже можете не быть он может там мы можем его например не поставить а если он есть да Если есть какой ограничение не скажу что он не может быть другими типами данных потому что мы можем туда иди запихнуть и цифры и имя и адрес куда может можно там к подсказка подскажу он действительно является уникальным он должен быть уникальным потому что иначе Каким образом будет достигаться физическое Но если это айдишка и хотят не всегда
01:27:13 - 01:28:53
но про моряки обеспечивает нам по сути физический порядок мы видим увеличивается от одного до n соответственно уникальный потому что нам нужно конкретную диску мы не можем найти в таблицу несколько записей с одной дишкой Было бы странно и последний этот нот но он всегда представляет из себя значение не пустое данном случае точно надо правильно ответил что он не обязательно про Америки везде должен быть и тут у меня другой вопрос про моряки Представьте ситуацию у нас цифры то откуда эти берутся что нам для этого нужно сделать
01:28:04 - 01:29:21
Как Циферки то увеличивать честно скажу только что подумал ответ у нас Мы можем реализовать это по базе данных то есть база данных сама будет реализовывать вот эту структуру либо создать отдельную то есть кусок таблицу которую мы можем сбывать каждый раз И тем самым комментировать то же самое мы можем эту реализацию предоставить какому-то кибернетиту который будет это автоматически делать за нас уже отдавать а уже создавать уже с ID Да действительно мы можем сказать это автоинкремент если про Майский или про
01:28:43 - 01:30:01
постгресс это как-то Intel secons который будет генерировать это значение держать его и присваивать соответствующей запись в таблице Скажи а вот когда мы используем разговариваем нам для каждой таблицы нужен или мы можем использовать один я думаю Один на всех Независимый но Представь себе ну у нас же айдишка у каждой таблицы своя от 0 до n Разумеется задача сикса хранить текущее значение и следующее значение а в случае роллбэков внимательно если ты зафиксируешь последнюю а попытаешься выполнить энное
01:29:26 - 01:30:50
количество операций они будут провально то есть что следующая успешная операция будет не следующее значение а значение которое соответствует количеству попыток до успешной То есть он их использует потому что это как фейл фаст в коллекцию Разумеется Он снимает копию с ним работают чтобы потом приводить в согласованный вид и сделать ненужные индексации ему проще работать со следующим значением пропустить то что не получилось это просто эффективно Здорово офигенно Давай поговорим с тобой про запрос частности про операторы успел
01:30:18 - 01:31:45
запросы представим ситуацию что мне необходимо Соединить две таблицы что ты будешь использовать Union или Join честно тяжело признать на последний раз я записался Просто мои месяц я бы ну а у меня вопрос про разность этих Union потому что она обычно стройный использует аюня это разве не какая-то часть война нет [музыка] абсолютно все если это у нас есть Join Left joina Right там даже Еще какой-то вроде есть наверное когда мы можем объединить все таблицы и полностью их полностью вместе с нулями может так
01:31:01 - 01:32:45
Ну не совсем не совсем так на самом деле Join это буквальном смысле присоединение таблицы до какой-то часть данных это скрещивание то есть мы можем сказать что берем таблицу правую таблицу левую И вот так и склеиваем один к одному и должны соответствовать структуры данные должны соответствовать и так далее Потому что возникает вопрос по какому принципу эти таблицы объединять июня объединение да то есть мы берем дверь похожую таблицу складываем воедино Union Old обычного отличается будет он включать дубликаты или нет дубликаты
01:32:01 - 01:33:19
включает Union обычно не включать а Джоан он уже в свою очередь он таблицы присоединяет берет таблицу первую к ней цепляет допустим таблицу вторую только то что соответствует кондиции или критерию если мы говорим про и потом формирует нас монету тоже результирующую таблицу но ты сказал про Join его виды можешь объяснить чем разница между просто и Left Join Но обычно Живой но просто ищет совпадение и показывает таблицу уже исходя из этих совпадений Left Join и Просто берем нашу таблицу всю левую и просто к ней
01:32:41 - 01:34:05
добавляем например падение с правой но также у нас все нули которые не совпали они все равно сохраняются в нашей левой таблице если rigin то мы просто так же самое только наоборот правда да ты прав то есть energian или просто обычный Джон ищет совпадение один к одному и только на них реагирует совпадение заполняет их Где необходимо если совпадение не будет найдено то пропущенные недостающие данные просто заполнить на это просто противоположная часть Здорово звучит резонно Подскажи мне пожалуйста следующее что такое Волшебный
01:33:23 - 01:34:50
принцип транзакциями первая тамарность атомарно из потом это с это у нас согласованность и изолят изоляция это на спасение Точно точно это долгосрочность Ну да я тоже вечного забываю как он называется хорошо Объясни мне что вообще такое ну смысле давай пройдемся по буквам можешь объяснить что означает Атаман Ну могу я так немножечко обобщить А мы потом немножечко вылезем [музыка] мы должны отправить какой-то запрос тот же самый часто самый частый пример это прибыл денег с одного счета на второй и
01:34:06 - 01:35:42
Суть транзакции в том что когда Мы выполняем какой-то запрос то есть мы берем с одной таблицы отнимаем У кого-то пользователя определенную сумму денег там X и мы должны эту сумму отправить другому человеку Но что будет если у нас что-то пойдет не так ну то есть у нас вдруг нас параллельно кто-то залезет труба это попробовать то же самое сделать у нас получается один отнял и второй опять отнял но какая-то неправильно поэтому атомарность наверное в том что мы должны выполнять действия над одним элементом
01:35:05 - 01:36:12
то есть настолько один раз другие там запросы никак не влияют на обращение текущего То есть он должен закончить свое какая-то такая синхронизация получается Окей и это изоляция это не товар это изоляция считали это действительно говорит о том что пока выполняется транзакция 1 транзакция 2 не должна не оказывать никакого влияния на данное с которыми транзакции Один работает после того как транзакции один отработала в этот момент для работы с актуальными данными это как изоляция или по сути синхронизация
01:35:38 - 01:37:05
многопоточности или мы можем обобщить это такой ipads defort То есть все что все что происходит в транзакции номер один Разумеется должно потом быть известно транзакции номер два а транзакции номер два в транзакции номер один вырываться не должна но это изоляция А что всё-таки атомарность аномарность исходя из слова то есть одно какой-то значение определение односубщенность то есть что-то одно должно быть то есть что у нас одно должно быть но если сходить вообще с транзакции выполняется запрос если выполняется он
01:36:22 - 01:37:39
как-то неправильно мы его назад понять только один запрос на его не должны нарушить плюс у нас сюда еще то же самое согласованность Когда у нас правильно все работает то есть что согласовалась так само так сказать как же это описать на одну так абстрагируем немножечко от этого ну а товарность [музыка] не могу Наверное подобрать Я помогу атамарность говорит так же самое как многопоточности по сути это конкурентное выполнение транзакции подразумевает что мы фиксируем транзакцию целиком или откатываем все
01:37:00 - 01:38:34
что было произведено в рамках этой транзакцию То есть если транзакция включает себя несколько маленьких операций там Обнови эту таблицу обновить другую или представим себе наша транзакция состоит из трех операций списание операции 1 пополнение операция 2 и обновление бизнес-логов потому что операция произошла операция 3 и если списание произошло успешно зачисление успешно алоги почему-то сломались Ну то есть произошло исключение или какая-то ошибка в этом случае транзакция целиком откаты не должно быть несогласованного
01:37:50 - 01:39:03
состояния то есть Поэтому транзакция выполняется целиком как единое целое либо если хоть одно из них пошло не так то мы откатываемся и это по сути залог повторного успешного залог безопасного повторно этой же операции Если грустно если кто-то отправляет деньги а на самом деле у него снялись а там еще это не пришел да Вполне себе именно так хорошо давай тогда поговорим с тобой здесь о двух вещах первая вещь Это феномены какие ты знаешь негативные феномен или просто я что-то такое помнить честно я помню
01:38:27 - 01:39:52
это там связано как-то там есть что-то то есть Какие проблемы возникают при работе с конкурентными транзакциями одновременно в отношении тем что мы можем задеть данные другой транзакции мы можем их как-то нарушить И тем самым транзакции уже не будет считаться изолированной большей степени да но тут нужна какая-то четкость Потому что тут абстрактно описать это крайне сложно Точнее то можно на это будет недостаточно но смысл какие есть феномены не обязательно знать их имя Но необходимо знать что происходит
01:39:13 - 01:40:37
допустим могу подсказать есть так называемый или грязное чтение Вот что за ним подразумевается что мы как-то читаем их не может мы их читаем не обновленными возможно я просто точно не помню это возможно действительно как-то мы их не успели еще обновить мы их берем уже не свежую информацию она у нас устаревшие не совсем так может быть Rapid повторяемый повторяемое чтение то есть тоже я не скажу возвращаюсь к подразумевается то что есть две транзакции первая транзакция начинает выполнять свою операцию и она
01:39:57 - 01:41:29
начинает изменять данные в этот момент вторая транзакция на основе не закомеченных данных от транзакции 1 начинает выполнять свою операцию то есть принимать решение на основании данных которые первый транзакция еще не за комиссии потом оказывается что транзакция номер один сделала ролл бег номер два уже приняло решение на основании В итоге не существует Разумеется у нас еще два феномена Rapid был и Фантом говорит о том что когда мы работаем с конкретными данными Ну допустим у нас есть записи есть поле то транзакция 1
01:40:50 - 01:42:09
считывает эту информацию что-то с ним делать и после того как в этот же тот самый момент транзакция 2 тоже что-то делает с этими же самыми данными после как транзакция 1 обратиться к этим данным еще раз она обратить внимание что данные изменились и данные изменились Не потому что она изменила потому что непонятно Откуда это произошло то есть по сути мы говорим что в этом случае пока транзакция 1 работала с данными в этот же момент транзакция 2 выполнила изменения этих данных и соответственно после транзакции один сидит и
01:41:32 - 01:42:40
недоумевает что же так откуда почему данные поменять и последний собственно это уже у нас Фантом это касается выборки мы говорим как правило про критерию допустим выбрать что-то в каком-то диапазоне то есть мы работаем с диапазоном записи и когда транзакция 1 получает поэтому критерию записи транзакция 2 в этот же момент этому самому критерию изменяет эти записи удаляет запись или Новую добавляет и после транзакции один такая смотри здесь что-то новое добавилось и соответственно тоже недоумевает то есть
01:42:06 - 01:43:12
по сути про одно и то же отсутствие изоляции приводит к неправильным решениям В итоге им консистенция Да и тот вопрос как это все решается есть такие штуки как уровни изоляции уровни изоляции А сколько их там четыре вроде [музыка] как они называется Да еще раз read read On committed ну то есть чтение не закомеченного сегодня изоляция Когда мы можем только прочитать еще не закомиться Но это тот же самый der terries получается да да И тогда вопрос Вот это ты правильно отметил что при уровне изоляции ритм КАМиТ от
01:42:39 - 01:44:10
возникает Тогда вопрос каким уровнем изоляции решить эту проблему наверное наверное следующий Ладно можно было но вероятно А может и нет тоже связанные с Наверно с феноменами которые соответственно эти уровни изоляции и и работает соответственно с этим феноменами ну представим себе у нас произошла произошел феномен репетита был то есть в тот момент когда транзакция один получила доступ к конкретным данным она увидела что после работы с ними эти данные вдруг изменить Как можно решить этот феномен
01:43:33 - 01:45:02
при помощи какой какого уровня изоляции или даже скажу здесь два уровня изоляции эти наверное 4 Да ну если так Туда а если так без читера то Ну третий наверное как-то их закончить одну Но получается Он засчитает данные потом их прочитал и они у него опять изменились ему опять нужно прочитать То есть ему нужно их читать до того момента либо после уже каких-то изменений то есть Нам нужно как-то ограничить какую-то направленность сейчас ты читаешь вот через секундочку будешь ты читать Ну так-то резон но тут чтобы
01:44:29 - 01:45:59
чтобы это заставить спел делать надо знать что сказать Понимает как собака на самом деле здесь можно применить уровень изоляции но на какие-то был Рид это феномен лечение какие-то изоляция или сериал И разумеется когда мы говорим про Фантом риц там тоже можно применить серия lightsball есть и другие способы это в частности мы говорим про пессимистическую оптимистическую блокировку это как раз то что ты хотел описать по смыслу очень сильно снизить в подарок когда мы говорим вот мы буквальном смысле захватываем эту
01:45:16 - 01:46:33
таблицу или эту конкретную запись и с ней никто работать не может пока эта транзакция не завершит работу Ну допустим это называется Select for update или это Лог это не изоляция это блокирование или замыкание когда одна транзакция блокирует какую-то запись для того чтобы в итоге сделать ее обновление Но это другая Ладно давай тогда перейдем от SQL в Spring и поговорим о самом интересном Расскажи пожалуйста в чем разница между инверсией управления в Control и dependency injection но они одно целое по сути представляет
01:45:57 - 01:47:28
это возможность искать контейнера который все в Control это мы даем разрешение на манипуляции создания объектов вместо нас мы говорим вот ты можешь вот конструктор создать что-то пожалуйста когда мы для создания какого-то конструктора того же сам блока этого концу то есть бина мы должны использовать то есть другие кусочки конструктора и мы тогда просто Настоятельно и инжектит уже созданы объекты чтобы создать один То есть мы развязываем просто все руки этим и тем самым нас меньше зависимости становится
01:46:43 - 01:48:05
окей Окей хорошо но все-таки есть ли какая-то грань между dependency injection и инверсию управления или все-таки нет Ты просто вроде как одно и то же но вроде как не одно и тоже вроде Это вроде бы решение разные вещи делать Как по мне они знаешь дополняют Идеальная пара просто один создает один создался сдал потом что вот нам нужно для создания одного еще что-то создать он пошел создал Создал и потом сконструировали этот нужный объект и получается Окей тогда вот в этом то что ты описал у меня вот как раз был вопрос Где там
01:47:23 - 01:48:46
инверсия управления А где там внедрение зависит внедрение зависимости Когда мы уже созданный объекты либо даем команду что их надо создать и тогда мы их является сам объект который у нас уже в контейне хранится а инверсия управления тогда где управление создания этих объектов то есть мы даем и доступ чтобы она сделана какой-то объект то есть вот объект А что если скажу что все что ты сказал это всего лишь внедрение зависимость чтобы ну я соглашусь я Признаю свою ошибку и лучше Спорить не буду на самом деле инверсия управления
01:48:10 - 01:49:45
потому что форум проявление инверсии управления несколько есть допустим Factory Я имею до как шаблон проектирования это тоже реализация версии управления потом сервис лука то есть разные формы проявления и по сути когда мы говорим про внедрение зависимости включает себя полный набор от конфигурирования самостоятельно то есть по сути я как разработчик Я отдаю стрингу некоторые вещи первое сконфигурирование сделаем Мне его работо ровным то есть благодаря конфигурации и Введи его в эксплуатацию там где мне это
01:49:08 - 01:50:17
необходимо То есть это конфигурация создания Ну я бы сказал бы инициализация и в конечном итоге внедрение Да поговорим про внедрение зависимости в springer с точки зрения программного кода Какие виды внедрения зависимости есть After Right У нас есть зависимости или это немножечко не туда либо ты говоришь про как это в коде написать Я же спрашиваю принципиально Как можно внедрить зависимость посредством чего Ну допустим куда можно совсем так посредством мы можем создать во-первых объект то есть объекты
01:49:46 - 01:51:11
это наши спины Мы можем с помощью это конфигурация это уже конфигурация А я же говорю о том куда мы можем их внедрить но предположим вот у меня есть Бин Мне нужно его куда-то внедрить вот Какие первые способы на ум приходят Как я могу один Бин или один объект джавовый передать куда-то в другое место для другого объе КТА с помощью Ну аннотации можно с помощью контекста мы можем вытянуть Смотри я сделал намек Я говорю Java Представьте у тебя Java Объект который зависит от другого Java объект вот как
01:50:31 - 01:51:50
объект коллаборатор передать объекту которому в котором Он нуждается что-то значит общее должно быть у них нет Если можно сделать вот у тебя есть класс Ты хочешь его про инициализировать чтобы этот объект этого класса работал тебе необходимо ему предоставить какой-то другой объект который под капотом у него там что-то выполняет как этот можно сделать придать в Конструктор объект первое раз Хорошо действительно первым еще какие варианты есть в этом случае [музыка] конструктор А подожди Это как и переменная Да я вообще куда-то
01:51:14 - 01:52:54
конечно Конечно Мы говорим про внедрение зависимости через конструктор через специальный метод конфигурации через и тут у меня вопрос что выполняется раньше что выполняется самая последняя потому что Стрим позволяет одновременно подумать я помню разницу между переменной конструктором чем разница тем что когда мы конструктор мы не привязываемся к контексту это тот Вопрос немножко не об этом вопрос заключается в том что если я выбираю внедрение зависимости через конструктор или через свойства или через
01:52:11 - 01:53:34
центр Какой порядок выполнения То есть я выбрал сразу все три одновременно Какой порядок выполнения Ну Исходя из логики Java но сначала используется конструктор создается переменная а потом переменную мы можем этот сайт использовать и все-таки переменная внедрение через свойства она будет второе или третьего тут я не уловил перемены немножко запутался Да действительно здесь подвести итог вне зависимости посредством конструктора свойства или сеттера порядок выполнения точно такой же как я сказал первый конструктор это
01:52:55 - 01:54:13
логично второй это через свойства тоже возможно и третий Разумеется через центр конфигурационный метод который как правило мы И для этого используем что когда уже объект создан эксплуатируется мы можем его как-то видоизменять хорошо ты заговорил за такие вещи как конфигурацию там какая-то xml жала конфигурация Какие виды конфигурации в целом Ты знаешь сколько Ну xml сонатациями и наверное смешанные использовать это какой xml и хорошо а еще какая есть 3 3 так аннотации Так ну аннотации У нас есть конфиг может
01:53:41 - 01:55:15
Ну это же те же аннотации если Java config использовать но там еще что-то вот как раз ты правильно есть контакты configuration но там еще что-то есть Ну смысле как вот эта конфигурация [музыка] на самом деле называется Потому что ты программно можешь создавать бины то есть аннотации Да действительно только будет точнее вручную описывает что им за зависимость давать как их эти объекты создавать Spring будет только выполнять эти соответствующие методы То есть ты программ а можешь мне назвать причину
01:54:37 - 01:56:03
почему стоит использовать Почему стоит использовать конфигурацию через аннотации и почему стоило бы не использовать аннотацию через Java конфигурацию из аннотации Ну наверное это релевантность но актуальность в наше время потому что все через аннотации люди делают Но скажу что не потеряла она своей актуальности Я имею Java конфликт тоже широко используется говорить не буду но мне кажется все таки через нотации делать конфликт наш а так мы получается сами прописываем наши Конфи и мы можем что-то не то сделать А так уже по сути
01:55:34 - 01:57:05
реализованная конфиг и мы просто с помощью аннотации его дополняем резона звучит на самом деле резонно я тебе скажу что даже через аннотации можно что-то не так сделать Spring такая штука всегда что-то может так сделать я бы тогда перефразировал бы вопрос и задал бы его иначе В каких случаях ты бы применял бы Java конфигурацию таких случаях когда мне нужно изменить какие-то мне это да например хотя их и так могу определить идеи конечно что тебе мешает создать класс или определенными методами и кинуть на
01:56:21 - 01:57:34
него аннотацию это не тот мы не можем когда действительно я так не задумал если честно когда мы можем скажем В каких случаях Мы просто не можем использовать аннотацию каких случаях Когда у нас объекты уже существует То есть это не наш объект они уже созданы то есть мы не можем Например у них как-то их обозначить аннотации тот же самый компонент то есть они уже реализованы не нами объекты или класса Когда у нас есть сторонние библиотека мы не можем ее изменить мы не можем сами навешивать меня нотацию
01:57:00 - 01:58:28
по истории не важно поэтому единственный способ создать экземпляр в качестве на такого класса только создатели пронициализировать Ну и Разумеется прингу сказать как этот объект создать и потом добавлять в контекст хорошо звучит резонно Мне нравится [музыка] и тут такой Следующий вопрос по спрингу конечно же Какие аннотации Ты знаешь для сообщения Стрим Go чтобы он создал на основании этих аннотаций Бин [музыка] Бин компонент И все кто в себя включает компонент то есть контроллер контроллер 2 из
01:57:49 - 01:59:26
сервис репозиторий шикарно писал задам вопрос с подвохом представьте себе ситуацию у тебя Java конфигурацию У тебя есть класс у него аннотация configuration а внутри есть метод аннотированный Бином в принципе с этим Бином проблемы никакой нет Есть какой-то класс это наш класс Несмотря на то что это наш класс Мы все равно решили создавать свою очередь Java config Ну и Бог ничего страшного вопрос Следующий вдруг мне захотелось создавать этот Бин с скопом прототай и мне пришла Светлая мысль такая же аннотация скоб и я на
01:58:41 - 02:00:25
классе повешал аннотацию скоб но Разумеется все А все остальное осталось configuration внутри этот метод создает экземпляр этого соответствующего класса А на самом классе экземпляр которого мы создаем у нас висит аннотация School и там Значение протота вопрос Следующий Будет ли работать это или все-таки bin останется в сингл Тоне по умолчанию Я думаю не должна работать но просто я вряд ли думаю что тестировщики спинка думает что будет такие изощрения но мне кажется что скоб можно повесить Ну на Бин именно на сам метод они на
01:59:34 - 02:01:22
Да резона звучит Но тогда у меня вопрос А что если я буду создавать Бин через компом скан Ну то есть у меня будет Classic на нем висеть аннотация компом Или там сервис предположим или получается что рядом я не смогу теперь возле не оставить аннотацию я могу аннотацию применять только с аннотацией вот тоже вопрос возможно Я думаю так можно делать Возможно мы не можем именно самой нотацию поставить мы можем как-то внутрь аннотации добавить какое-то значение то есть может внутри аннотации Значит получается что мы можем добавить
02:00:29 - 02:02:02
аннотацию и на класс скупы на класс Исходя из логики потому что тоже есть так подумать то мы если мы действительно хотим наш компонент ограничить с клубом определенным то Мы же должны Это как-то явно указать мы можем это сделать действительно так оно есть да здесь подвох заключается в том что когда мы работаем от аннотации компонент или там сервис допустим и подобных комбинации с аннотации скоб тогда это работает когда мы работаем в Java конфигурации создаем Бин при помощи аннотации то в этот момент Spring не
02:01:16 - 02:02:27
будет учитывать сигнатуру самого класса он просто создаст свой экземпляр потому что просто выполнится метод сам по себе в этом смысл подхода Spring вызовет метод который мы описали и результат его добавит в контекст и при этом не будет учитываться поскольку он будет ее сканировать Поэтому в этом варианте как ты правильно ответил Нам необходимо уже аннотацию School клеить вместе с аннотацией bin Однако это не исключает применение с аннотациями компанией вместе если мы используем подход компании когда на основании
02:01:51 - 02:03:10
аннотаций мы сканируем все классы и потом создаем их бины хорошо Это был другой вопрос кстати раскрывает побочных эффектов но просто даже общее понимание как она делается Мне кажется это один из пунктов просто человека с опытом и человека без опыта просто Ну вот один наглядный пример максимально сделать это удобным в то же время реалистичным резон Давай последний вопрос и что такое springboot и основное преимущество получается фишка его в автоконфигурации может все автоматически из конфигурировать у него также он легко
02:02:30 - 02:04:01
создается буквально несколько dependency нужно чтобы его создать и один класс просто и аннотация будет Application который включается и суть спины будто тем что он видит какие у нас пакеты как я понял видит Какие нас пакеты есть и он предполагаемое уже реализует автонастройку их базовую по умолчанию мы можем переопределить У нас есть которые мы можем использовать для каких-то дополнительных настроек либо чего-то изменения также мы можем их явно определить будет используется для вот такого быстрого старта плюс хороший
02:03:28 - 02:04:51
у него там То есть у него уже сервер встроенный в него и он его быстро ранит потому что я когда использовал обычный Spring когда я учила Его обычный фреймворд 5 и потом пришел в Бут то у меня тоже самое там как просто за секунды 2 взлетал максимально быстро очень прикольно Согласен Все принято но у меня еще один вопрос что еще он крутого предоставляет того что нет в обычных тренде этот его как он называется актуатор они Я не говорю про конкретную реализацию Я сказал бы что принес Spring Boot Какое
02:04:16 - 02:05:41
спокойствие он принес разработчикам ты правильно сказал это конфигурация подключил актуатор стартер и все завелось не надо только скормить ему конфиги но это другой вопрос уже на это ответил но была еще одна большая проблема и проблема допустим Когда я смотрю что был спринт я все нормально работал вдруг я решил подключить к нему компоненту Spring Security и по какой-то чудной причине она не работает Хотя вроде Смотришь еще Норм но она не работает А в чем же была проблема в том что различные зависимости нам нужно было
02:04:58 - 02:06:10
контролировать эти зависимости А сейчас у нас есть старт и просто пакеты как будто которые мы можем инжектить и они будут автоматически подтягивать версию то есть там ну сейчас 3.0 ты уже там может выше но там предыдущая 2.7 самая адекватное было и она автоматически в малоне проставляется и исходя из этой версии нас подтягивается все зависимости и уже у нас такой проблем нету точно Ну да логично звучит Да правильно это называется версионирование данном случае совместимы по версиям была проблема
02:05:35 - 02:07:02
разные компоненты спринга полезные и не полезные крутые не Крутые они были несовместимы очень часто и это боль ложилась на разработчиков springboot благодаря своему парентовому модулю он же принципе можем назвать бом Да Белов материал он сам собрал все совместимые версии и все что нам нужно просто поднять версию самого спрингута как под капотом они будут совмещаться Это уже не наша забота то есть укажем одну версию все остальное абстракции Да Абсолютно верно Наша задача знать Просто Что находится внутри но ни в
02:06:18 - 02:07:37
каком состоянии мы знаем что Spring нам даст в рабочем состоянии нам нужно передать конфигурацию как она будет запускаться А как он свяжет какие зависимости там внутри какие версии совместимые компоненты несовместимы это не наше забота абсолютно всем хочется тебя поздравить Мне кажется держался очень здорово сразу видно немного устал Да и сам на самом деле устал Хотелось бы тебя спросить как твои ощущения чувствуешь ты себя круче чем было до этого собеседования ответил ли ты на все свои вопросы которые хотел
02:06:58 - 02:08:01
прояснить по-любому чувствую себя намного проще в любом случае я был лучше чем Ну тот же самый 2 часа назад это сто процентов плюс Многие вещи я теперь могу их посмотреть просто по другим взглядом плюс я это опять хочу пересмотреть и уже нормально заносировать себе потому что у меня постоянно все записи их просто в офисе складывали и потом перечитывает так же самое Например я не готовился и не писал потому что данный момент я изучаю реакт и например мне три месяца и глаза не видел но Я использовал свои заметки
02:07:32 - 02:08:54
просто как конспект подготовился прочитал и принципе вспомнил в суть этого языка прелестного и по самому интервью Это мой первый опыт как интервью Я думаю во-первых это бустит мои софт скиллы в любом случае хоть как-то эмоционально себя держать и во-вторых я молчу Просто про большую базу знаний которые вы сегодня можно было показать с помощью этих умных вопросов таких и именно вопросов не просто знаешь шаблонных которые ты можешь просто встретить а именно вот которые бьются такие точки где видно что
02:08:13 - 02:09:30
человек хромает вот туда и именно такие вопросы Я думаю и позволяют человеку и учиться Я думаю Вот с этого интервью Я выучил намного больше чем я выучил например целую неделю поэтому Это огромный плюс и Большое спасибо тебе и рад что это Например первое интервью было именно с тобой Спасибо большое Слушай прям ты описал свои эмоции Как сказать чего у тебя получилось достигнуть еще Прям аж Засмущал части а единственное хочется здесь добавить действительно интервью позволяет Познать себя избавиться своеобразное от страха
02:08:51 - 02:10:14
интервью Ведь все мы проходили его и я когда-то тоже первый раз ходил на Интервью было страшно не знал что ждать с другой стороны как-то правильно отметил они позволяют её формировать свою собственную мап понимает где ты хорош где нужно подтягивать знания я допустим всем всегда советую после интервью во время интервью делать заметки и потом переносить их в какой-то файл Ну не обязательно в любой форме в бумажку либо детальной форме Я так и делаю потом я раз в год делаю анализ и планирую себе какие-то тренинги то есть
02:09:32 - 02:10:36
в этом году я был плох в этом в следующем году мне необходимо подтянуть знания и именно интервью позволяет это сделать потому что как правило в процессе работы с коллегами ты скорее всего учишься в том что ты уже Хорош или дети просто не явно подсказывают коллеги А когда ты сам это еще сложнее потому что нету обратной связи интервью эту обратную связь как раз помогают да то есть они нас двигают вперед и мотивируют я хочу пожелать тебе большое спасибо за уделенное время было очень круто пообщаться я могу тебя однозначно
02:10:05 - 02:11:09
заявить что как ты сказал три месяца паузы не трогал Java но мне кажется что через неделю если я тебя задам еще раз вопросы поджали определенный Я думаю Или даже через три месяца еще ты будешь Еще круче поскольку видно что ты учил ты занимался ты применяешь в первую очередь и не стоишь на месте развиваешься это круто И хочется пожелать удачи Ну и пусть все получится поскорее спасибо спасибо большое это очень приятно слышать и опять Спасибо за интервью Это было очень классно И самое главное это было полезно что в наше
02:10:37 - 02:11:51
время это бесценно знание приятно это слышать спасибо еще раз за твое время Будь здоров удачи если что ты знаешь где наши Skype Ты можешь писать мне в личку Если будут какие-то вопросы с радостью на них отвечу Ну что пока Пока До новых встреч вот так друзья и прошло наше техническое собеседование как видели Алексей очень Стойко выдерживал все вопросы и испытал как заключение Мы видим что он понял что не так уж и страшно ходить на интервью всего лишь требуется пару раз попрактиковаться подготовиться к этому
02:11:14 - 02:12:22
серьезно и потом выходить на реальные интервью для поиска настоящей работы своей мечты чтобы перформить там вместе с другими разработчиками друзья подписываемся на наш канал ставим колокольчик ведь это офигенно позволяет нам продвигаться на просторах YouTube Но более того это нас мотивирует делать контент круче круче каждый день именно того что вы действительно заслуживаете и того что вы от нас ожидаете напоминаю У нас есть крутой телеграм-канал Где вы можете почитать посты разнообразные а также испытать свое счастье через квизы
02:11:48 - 02:12:49
и таким образом проверить действительно свои знания и получить хорошие ответы Если Вы ответили неправильно но в том числе там можно почитать индивидуальные посты от меня о том как происходят рабочие будни разработчика на сегодня это все друзья До новых встреч в новом видео пока-пока
02:12:19 - 02:12:55