# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
|
|||
Рекомендуемая литература: Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 13 мин. [Показать отчёт] Научился: Singlton(Одиночку) в здравом уме и твердой памяти не использовал. Уместен этот шаблон когда в программе нужен глобальный объект с доступом из любого класса да ещё и с возможностью регулировать время его жизни. Статический класс хорош для описания, к примеру, неизменных математических функций. Singlton актуален для единственного процесса в программе, с гарантией запрета появления его дубликата. getInstance() при первом обращении создает экземпляр и его возвращает При последующих обращениях возвращает текущий объект. Статические методы ГОРАЗДО быстрее синглтона. Синглтон годен для наследования и полиморфизма (в отличие от статики). |
|||||
2 | Singleton - Config - Final |
|
|||
Мы начинаем серию коротких уроков по созданию класса считывания данных из конфигурационного файла. Для начала мы организуем несколько конфигурационных параметров в виде констант и расположим их в основном классе Program. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 56 мин. [Показать отчёт] Научился: класс Одиночка создаёт единожды (getInstance()) свой экземпляр и возвращает при повторных запусках (getInstance()) тот же текущий экземляр, а не новые и не позволяет повторить это же действие извне (Cat cat = new Cat();- так не прокатит с Синглтоном) final - такую константу изменить нельзя Не нашел методом тыка, как в Eclipse из sysout получить system.out.println Погуглил. Нашел решение - CTRL+SPACE Из статичного метода нельзя обращаться к нестатичному контенту |
|||||
3 | Singleton - Config - Git init |
1 тест |
|||
На этом уроке мы про инициализируем git репозиторий для проекта, который мы создали на прошлом уроке. Систему git мы будем использовать для контроля версий наших исходников, коммититить рабочие варианты решения одной и той же задачи, да и просто дополнительная практика использования git в разработке. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 21 мин. [Показать отчёт] Научился: второй подход к штанге git Mokytojas == Учитель В папке создали репозиторий git git init - инициализация репозитория (контроль версий начат) git status - текущее состояние репозитория git add Program.java - начать отслеживать изменения в указанном файле git commit -m "Final consts" - записать в репозиторий (ЛОКАЛЬНЫЙ) первое состояние отслеживаемого файла git log - журнал событий После этих действий появилась скрытая папка git - это локальный репозиторий, где будут падать все коммиты (Ваши записи о текущем состоянии файлов и кода в них на момент коммита) |
|||||
4 | Singleton - Config - Static |
|
|||
На этом уроке мы продемонстрируем, как обращаться к константам из отдельного класса. Для этого мы создадим новый класс Process(), добавим в него метод demo(), в котором реализуем вывод данных из констант класса Program(). Константы необходимо будет сделать статичными. Так же мы порефакторим имена констант, чтобы они были по стандарту ЗАГЛАВНЫМИ буквами. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 30 мин. [Показать отчёт] Научился: доступ к статической переменной из другого класса выполняется указанием имени класса + точка + имя переменной ALT + SHIFT + R - хоткей для переименования переменной(константы) во всех местах её доступности одновременно из одного места Статические переменные невозможно редактировать и нельзя установить извне Преимущество группировки данных в отдельном конфигурационном файле в лёгкости замены конфигурации - сменил файл-класс = разом сменилась конфигурация |
|||||
5 | Singleton - Config - Git add |
|
|||
На этом уроке мы зафиксируем очередные изменения нашей программы с помощью команды commit в git репозитории. Для начала мы посмотрим, что изменилось с последнего коммита. Добавим изменённый и новый файлы на сцену и закоммитим их в историю репозитория для фиксации очередной рабочей версии нашей программы. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 21 мин. [Показать отчёт] Научился: git status == покажет появившиеся новые в проекте файлы и измененные имеющиеся под надзором Системы Контроля Версий git add Process.java == добавим под присмотр новый файл-класс git commit -a == закоммитить изменения в отслеживаемых файлах, без добавления нетрекингуемых новых файлов git log == журнал активности СКВ |
|||||
6 | Singleton - Config - Class |
|
|||
На этом уроке мы выделим всё, что касается конфигурации в отдельный класс. Для этого мы создадим новый класс Config() и перенесём туда наши константы. Так же нам нужно будет исправить появившиеся ошибки, указав новое расположение констант. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 32 мин. [Показать отчёт] Научился: у Java нет глобального пространства имён Переменные видны в каком-то определённом классе Для доступа к переменной УКАЖИ имя класса или название экземпляра Модификатор static позволяет обращаться к переменной из любого класса Статическим переменным при запуске программы выделяется участок памяти, что при больших программах не лучший вариант Доступ к статическим переменным неавторизованный - как в вагон метро входит и считывает внутреннее убранство кто хочет и когда хочет Сложности: найти где в Эклипс увеличить шрифт. Спрятано здесь: контекст (ПКМ) - General - Appearance - Colors and Fonts - Java Editor Text Font - Edit Спрятано на пять баллов, без навыков гугления, я найти эти дебри на смог |
|||||
7 | Singleton - Config - Git commit |
1 тест |
|||
На этом уроке мы заново попрактикуемся в работе с git. Вначале мы попробуем закоммитить изменения, но увидим, что новый файл не попал в коммит. Так как он не отслеживался системой git, его необходимо вначале добавить на сцену и только потом закоммитить. В дальнейшем система git будет отслеживать изменения данного файла автоматически. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 24 мин. [Показать отчёт] Научился: git status == посмотреть текущее состояние дел в отслеживаемом каталоге git commit -a -m "some comment for this commit" == перенести отслеживаемые файлы из отслеживаемой директории(Working Area), минуя индекса(Staging Area), сразу в локальный репозиторий Repository (БЕЗ НОВОПОЯВИВШИХСЯ ФАЙЛОВ И ПОТОМУ НЕОТСЛЕЖИВАЕМЫХ) git diff == производит сравнение между разными состояниями одного файла |
|||||
8 | Singleton - Config - FileReader |
1 тест |
|||
На этом уроке мы с вами доработаем класс Config(), чтобы параметры хранились и загружались из файла. Для этого создадим файл конфигурации, перенесём в него настройки программы и в классе Config() добавим метод считывания из нашего конфигурационного файла. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 25 мин. [Показать отчёт] Научился: рабочая директория программы при запуске - корень проекта, а не bin или src При считывании строки пользуемся простым методом readLine При считывании числа, чтобы оно не осталось строкой, его обрабатывают классом Integer методом parseInt, передавая в него аргументом считываемую строку Чтобы получить доступ к методам иного класса, в каждом методе требуется создать экземпляр того класса, к которому происходит запрос Статик не годится, когда придётся менять значение переменных (к примеру при считывании их значений из конфигурационного файла) Когда убрали статик, пришлось в каждом методе создавать экземпляр класса Config - получается дублирование одного и того же действия в угоду получения доступа к переменным в другом классе |
|||||
9 | Singleton - Config - Git default |
1 тест |
|||
На этом уроке мы закоммитим все наши изменения. Для начала мы создадим копию конфигурационного файла с именем config.default.txt. Это необходимо делать, чтобы небыло конфликтов из-за того, что у каждого разработчика будет своя версия config.txt для корректной работы приложения. Так же изменим значения файла config.default.txt на значения для примера, чтобы каждый смог изменить их под себя. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 38 мин. [Показать отчёт] Научился: для загрузки в репозиторий переименовали конфигурационный файл в config.default.txt + я перетащил его в подкаталог src (НЕ ЗАБЫТЬ!) git add config.default.txt - добавили в индекс (STAGE AREA) git commit -a -m "somecomment" -залить в локальный репозиторий все измененные файлы git diff 0023 - первые цифры(литеры) из идентификатора коммита который сравнивается КРАСНЫМ - то что удалено ЗЕЛЕНЫМ - то что стало СЕРЫМ - нетронутое |
|||||
10 | Singleton - Config - Static field |
|
|||
На этом уроке мы поэкспериментируем с оптимизацией загрузки конфигурационного файла. Остановимся на варианте глобальной версии с передачей в другие классы в качестве параметра. Так же закоммитим наши изменения в git репозиторий. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 51 мин. [Показать отчёт] Научился: вынесли из методов создание экземпляра класса Config в тело класса Program, добавили модификатор static и передали экземпляр config аргументом в вызов метода demo При варианте инициализации config в теле класса Process с использованием конструктора, не забываем, что передачу config аргументом в метод надо убрать, а этот же аргумент передать в создаваемый экземпляр класса |
|||||
11 | Singleton - Config - Static class |
|
|||
На этом уроке мы продолжим оптимизации, сделав всё в классе Config() статичным. Так же оптимизируем классы Program() и Process() для использования статичной версии класса Config(). После чего добавим загрузку конфига в классе Program(). Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 13 мин. [Показать отчёт] Научился: Java не позволяет делать классы статичными C# не имеет такого ограничения Поля и методы в классе Config сделали статичными Конструктор Config вызывающий метод load загружающий config.txt пробовали удалить Если методы статичные - обращение к ним просто по имени класса Вызов метода load загружающий данные из config.txt установили в PSVM В варианте со статиками в классе Config загрузка данных всё равно производится, хотя и единожды Статикой стоит увлекаться, если имеем в работе просто набор методов При наличии полей/атрибутов/переменных - статика неуместна Статичные классы не наследуются, методы не переопределяются, ограничений много |
|||||
12 | Singleton - Config - Using pattern |
1 тест |
|||
Мы рассмотрели множество рабочих вариантов реализации, но на деле их эффективность зависела от конкретной реализации и при определённых условиях требовалась доработка. На этом уроке мы наконец реализуем шаблон проектирования: Синглтон (Singleton). Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 28 мин. [Показать отчёт] Научился: Одиночка - это Приватный конструктор (извне экземпляр объекта не создать) Экземпляр объекта хранится внутри объекта (коробка в коробке) Статичный метод getInstance():Singlton используемый для доступа к единственному экземпляру ====================== -В классе Config.java удалили все статики за ненадобностью -Удалили конструктор, запускающий метод load ---------------------- +Объявили экземпляр класса с названием instance Инициализировали его значением null cо static +Создали приватный конструктор, запускающий метод load +Создали статический метод возвращающий экземпляр объекта getInstance И СОЗДАЮЩИЙ ЕДИНОЖДЫ НОВЫЙ ЭКЗЕМПЛЯР КЛАССА CONFIG ЛИШЬ В СЛУЧАЕ ЕСЛИ ЭКЗЕМПЛЯР КЛАССА CONFIG == NULL В классе Config единственным доступным статическим методом стал Config.getInstance() |
|||||
13 | Singleton - Config - Cant extend |
1 тест |
|||
На этом уроке мы вынесем из класса Config() код синглтона в класс Singleton() и попробуем унаследовать его. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 8 мин. [Показать отчёт] Научился: попробовали прикрутить к классу Config наследование от Singleton В Синглтоне используются статические методы, а они не наследуются git checkout Config.java - откатили Config.java до крайнего коммита git checkout Process.java - откатили Process.java до крайнего коммита git log - посмотреть историю коммитов |
|||||
14 | Singleton - Config - Super child |
|
|||
На этом уроке мы всё же разделим класс Config() на две логические части. Для этого мы выделим логику Синглона в отдельный класс ConfigSingleton(). Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 27 мин. [Показать отчёт] Научился: унаследовали класс с Синглтоном от Config, создание Одиночки перенесли туда Обращение к Синглтону подправили в классе Process Загрузка из текстовика оставлена в классе Config, вызов его решен методом super() - вызов метода из суперкласса |
|||||
15 | Singleton - Timer - Pattern Design |
1 тест |
|||
На этом уроке мы начинаем создание класса Секундомер() для засекания времени работы различных участков программы. Для разработки этого класса мы воспользуемся шаблоном проектирования Синглтон. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 33 мин. [Показать отчёт] Научился: создали новый проект под реализацию секундомера через Одиночку надо: + экземпляр таймера статичный приватный проинициализированный значением null + приватный конструктор с методом, засекающим время старта + статичный публичный метод getInstance создающий единожды экземпляр Таймера(Одиночки) В папке src запустили СКВ Гита git init - стартануть новый пустой репозиторий git add Timer.java - добавить в индекс (начать отслеживать изменения) файл Timer.java git commit -m "some commentarij" - создать новый коммит (слепок состояния кода) |
|||||
16 | Singleton - Timer - Start / Click |
1 тест |
|||
На этом уроке мы продолжим создание класса Timer() при помощи шаблона синглтон. Для начала мы добавим метод start() в класс Timer() для запуска секундомера. Так же мы добавим метод click(), чтобы увидеть сколько времени прошло. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 0 мин. [Показать отчёт] Научился: продолжили + метод старта секундомера публичный, ничего не возвращает, ничего не принимает + метод снятия показаний секундомера, ничего не возвращает, принимает на вход строковую переменную text git commit -m == Создание коммита git commit -a -m == закоммитить файлы, которые были изменены и удалены, но новые файлы, о которых вы не сообщили Gitу, не будут затронуты. git log == Просмотр коммитов в репозитории git log --oneline == Просмотр коммитов в репозитории с сокращенным выводом информации Сложности: Понять, что здесь git log --oneline надо писать онелине, а не онлине Это к вопросу о внимательности к мелочам и про "я набираю как в видео, а не работает" Было смешно, когда понял, что пропускал литеру "е" |
|||||
17 | Singleton - Timer - Program |
|
|||
На этом уроке мы наконец добавим основной класс для нашей программы: Program() и добавим в метод Program.main() необходимый код для демонстрации работы синглтона Timer(). Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 38 мин. [Показать отчёт] Научился: Math.sqrt == квадратный корень Math.cbrt == кубический корень Оптимизация Java может опускать исполнение инструкции, если очевидна её неприменимость, поэтому замыкайте тестовые нагрузки какой либо реализацией git add Program.java == добавили новосозданный файл в индекс git commit -a -m "some comment" == отправили в репозиторий (локальный) текущее состояние индекса |
|||||
18 | Singleton - Timer - String vs Buffer Speed |
1 тест |
|||
На этом уроке мы сравним скорость работы между String и StringBuffer. Для этого мы создадим новый класс StringSpeed() с методами runString() и runStringBuffer(). Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 32 мин. [Показать отчёт] Научился: создали два метода (со строковой и буфферизированной строковой переменными) принимающие на входе целочисленный аргумент количества повторений На аргументе 168 можно добиться близости к равенству времени обработки (иллюстрация 1), но повторы выполнения дают девиации, и не меняя код можно увидеть знатную волатильность Изменения аргументов в сторону увеличения показали рост эффективности буфферизированной строковой переменной git add новосозданному файлу git commit -a -m "соревнование строки и буфферизированной строки" |
|||||
19 | Singleton - Timer - Experiment |
|
|||
На этом уроке мы изучим класс Timer() и выделим часть кода для нового синглтона. Для этого нам понадобиться новый класс Log() который будет реализован как синглтон и заниматься логированием в консоль. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 44 мин. [Показать отчёт] Научился: создали отдельным классом ведение логов, в классе Одиночкой завели экземпляр log Как и требует букварь, + инициализация статического приватного экземпляра с присвоением значения null + статический публичный метод getInstance возвращающий экземпляр класса : а) новый экземпляр - если null б) уже созданный - если не null git add Log.java git commit -a -m "Add Log" |
|||||
20 | Singleton - Timer - Log class |
1 тест |
|||
На этом уроке мы разделим наш синглтон Timer() на две части: Timer() и SingleTimer(). Тот же эксперимент проведём и с классом Log(). После чего будет ясно, что лучше так не делать и вернём код в состояние на момента начала урока. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 42 мин. [Показать отчёт] Научился: создали класс SingleTimer утащили из класса Timer синглтон таймера + инициализацию nullом + getInstance, который у нас getTimer + конструктор экземпляра SingleTimerа, вызывающий родительский конструктор Одиночку целесообразно использовать в основном классе, откатили изменения назад git checkout Log.java git checkout Program.java git checkout StringSpeed.java git checkout Timer.java rm SingleLog.java == удаление файлов не добавленных в индекс rm SingleTimer.java Сложности: целесообразно применять Singleton если нужен уникальный доступ к ресурсам и если код не усложняется с дублированием методов или полей |
|||||
21 | ФИНАЛЬНЫЙ УРОК |
без видео 7 тестов |
|||
Поздpaвляю! Твoя зaдaча - прoверить cебя и пpойти тест, см. вкладку "Тест". Напиши отзыв или видеообзор по этому видеокурсу. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 3 мин. [Показать отчёт] Научился: вся суть Одиночки в том, чтобы экземпляр класса был один и тчк Реализация задумки проста - есть такая баская штука как пустота Эта пустота называется у программистов нАллом (null) При объявлении экземпляра Одиночки, он инициализируется этой самой пустотой А при обращении из программы к Одиночке выполняется проверка на эквивалентность экземпляра пустоте, и если Одиночка ещё равен пустоте, то создаётся первый, он же последний экземпляр Одиночки Если же при обращении к услугам Одиночки, выясняется, что экземпляр уже не равен пустоте(которой он был инициализирован), то методом возвращается тот же самый первый, он же последний экземпляр Singletona Наследовать от Одиночки не получится Если требуется монопольный доступ к Одиночке, для предотвращения одновременного доступа пишите synchronized в сигнатуру getInstance() Курс знакомит с основами шаблона, при достаточном усердии способен дать толчок для развития, при слабой мотивации позволяет выполнить задания на удовлетворительно и идти дальше Каждый выберет себе степень погружения в тему Видеообзор: 31ltOqe288Q |
|||||
22 | VIP - Singleton - Timer - Enum |
1 тест |
|||
На этом уроке мы реализуем синглтон с использованием перечислений. Для этого мы переделаем Log() из класса (class) в перечисление (enum). Тоже самое мы проделаем и с классом Timer() Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 47 мин. [Показать отчёт] Научился: при изменении класса на перечисление, обращение к перечислению происходит не по имени метода, а по имени экземпляра перечисления getLog() уходит в небытие, а вместо него пишем имя как в перечислении писали, в нашем случае LOG Весь код Одиночки стал не нужен, и был заменен одним экземпляром перечисления Если экземпляр перечисления не вызывается в коде, то и запуска конструктора не происходит |
|||||
Итого: 22 видеоурока |
2 час. 24 мин. 18 тестов |
13 чел. | |||
Финалисты: Иван Воронин, Сергей Соколов, Станислав, Povilas Abramovicius, Sergej Šugajev, Александр, Новопашин Владимир, Tekashnik, Andrei, Dmitry Sinitsin, Yefim, Anatoli, Tom . |