OTUS IT News – Telegram
OTUS IT News
7.21K subscribers
4.33K photos
303 videos
5 files
4.3K links
Экспертный контент по востребованным технологиям 2025 года: от разработки и аналитики до искусственного интеллекта и облачных решений.

Более 170 курсов+

🗓 Расписание бесплатных ОУ: https://otus.pw/24Da/
🦉 Голосуй за канал: https://news.1rj.ru/str/boost/Otusjava
Download Telegram
Для чего программисту нужны паттерны проектирования? Ответ, на первый взгляд, очевиден. Для того чтобы проектировать. И это правда.

Но, я сейчас предложу, менее очевидный ответ. Который, на мой взгляд, даже важнее, чем разработка хорошей архитектуры. Знание паттернов нужны программистам для общения.

Вот сравните например диалоги:
- Нам нужно разработать софт для АТМ. Чтобы можно было снимать деньги разного номинала и проверять баланс остатков в автомате.
- Хорошо, мы добавим в класс для каждого типа купюр, сделаем так чтобы они по цепочке обрабатывали запрос на снятие денег, передавая остаток, который не могу обработать дальше по цепочке. А чтобы посчитать остаток в автомате -- добавим специальный класс, который позволит перемещаться по цепочке и складывать остатки в каждой ячейке.
- Не понял, объясните пожалуйста.
и
- Нам нужно разработать софт для АТМ. Чтобы можно было снимать деньги разного номинала и проверять баланс остатков в автомате.
- Хорошо, мы используем Chain-of-responsibility для снятия и Iterator для остатков.
- Понятно, делайте.

А вам какой диалог понятнее?
Как узнать что память, которую занимал объект освобождена? В некоторых языках это просто - вызвал delete и можешь быть уверен - памяти стало больше. У нас в Java все сложнее.
С одной стороны -- отлично, что нам не нужно писать delete “руками”. GC все сделает за тебя. Потерял ссылку на объект, и ничего страшного. Память будет освобождена и без ссылки. Утечки не будет.
С другой стороны, очень хочется иногда написать delete, но нет такой возможности.
И, в самом деле, как узнать, что объект удален? Можно подписаться на события GC, мы о них уже писали, но они не про конкретный объект, а про событие для всех объектов. Можно переопределить finalize() (у всех классов он есть) и обработать событие в нем. Но, если таких объектов будет много, это может сильно снизить скорость работы GC, а медленный GC это большие паузы в работе всего приложения.
К счастью есть в Java способ узнать о том что объект удален без finalize в своем потоке, а не потоке GC, удобным способом. Это phantom reference. Это тоже ссылка на объект, как и нормальная ссылка, но у нее все по-своему. Получить объект по ней нельзя. Но можно найти ее в специальном пуле ссылок для удаленных объектов.
Создали ссылку, подождали GC, проверили в пуле. Если она там есть, значит объект был удален.
А какие еще типы ссылок есть в Java? И зачем они нужны? Приходите к нам - расскажем!
Найм, фриланс или свой бизнес? Почему чтобы найти свой путь, стоит попробовать все? Своим опытом и взглядом на походы к трудоустройству в новой статье делится Дмитрий Волошин (основатель OTUS):
http://www.chaskor.ru/article/tri_tipa_trudoustrojstva_41945
С радостью приглашаем всех 27 мая и 1 июня на Дни открытых дверей!
Из любой удобной точки мира - приходите к нам - формат проведения онлайн.
Проводить ДОД будет Виталий Чибриков - преподаватель на курсе Java разработки, один из основателей проекта и отличный специалист области с 12 - летним стажем разработки.
О чем будем говорить:
Расскажем почему OTUS больше чем просто образовательный проект и какие возможности получат наши студенты после прохождения обучения.
Расскажем о программе курса, практических занятиях и профессиональном сообществе разработчиков.
Расскажем о карьерных перспективах студентов и возможностях, предложенных компаниями - партнерами.
Ответим на все интересующие вопросы, поделимся новостями, просто приятно и с пользой проведем время.
Конечно, это еще не всё! Успешно прошедших вступительный тест на Дне открытых дверей ждет уникальная возможность. Спешите проверить свои знания Java и регистрируйтесь на День открытых дверей!
http://otus.ru/dod
Согласно тесту Тьюринга, если что-то плавает как утка, крякает как утка и летает как утка, то это что-то -- утка. Но что делать, если при этом она не работает без батареек?

Если в вашем приложении объект пришел к вам по референсу на базовый класс, но ведет себя не так как вы ждете от базового класса, то у вас в приложении нарушен один из принципов SOLID -- Liskov Substitution. Ошибка частая и не сразу заметная. Ошибка порядка наследования.

Например, у вас в приложении есть квадрат и прямоугольник. Что из них базовый класс? Школьная математика нам подсказывает, что квадрат это частный случай прямоугольника. Но в проектировании это не так.

Если прямоугольнику два метода: setHeight() и setWidth() вполне подходят, то что они должны делать с квадратом? Например первый может задавать размер квадрата, а второй… ничего не делать. Или наоборот. Это не так важно. Важно что архитектура у вас при наследовании квадратом методов прямоугольника сломана. И если кто-то получит на квадрат референс базового типа, он не сможет с ним работать.

Или другой пример: есть подвижный объект и неподвижный. Кто из них базовый? Ждем ваш ответ в коментариях.

Кстати, Liskov Substitution это только одна буква в SOLID (L).
Приходите к нам, расскажем про остальные четыре.
Наш главный преподаватель Java Виталий Чибриков (Vitaly Chibrikov) самоиронизирует :)

5 лет назад (когда была сделана фотография) у Виталия уже был солидный опыт преподавания и отличное чувство юмора :)
Наших компаний-партнеров стало еще больше!
Теперь и Лаборатория Касперского ждет на собеседования наших лучших студентов. Компания заинтересована в выпускниках курсов Python, C++, мобильной разработки и информационной безопасности. Запись на эти курсы откроется совсем скоро!
3 июня у нас стартует второй курс по программе “Java разработчик”, в преддверии этого события мы приготовили обзор программы обучения - чем мы руководствовались и почему считаем ее актуальной?
Все что вы хотели знать, но боялись спросить о Java! :) 👇 https://habrahabr.ru/company/otus/blog/329458/
Напоминаем, что первый День открытых дверей пройдет уже завтра! Мы не только поговорим о проекте OTUS, программе обучения и перспективах для выпускников, но и по традиции разыграем среди успешно прошедших вступительное тестирование несколько бесплатных мест в новой Java группе.
Если вы еще не зарегистрировались и не прошли вступительное тестирование - самое время сделать это!
http://otus.ru/dod
На первом Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу!
Победителями стали: Егор Кузьмин и Сергей Жерновой.
Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!
Начинаем понедельник с отличных новостей! Наших лучших выпускников по курсам Java, C++, JavaScript на собеседование ждет еще одна компания - 1С.
Еще больше карьерных возможностей!
Что такое “углубленные основы”? В нашей программе есть такая тема. Что такое основы Java думаем, понятно. Например, цикл for или ветвление if-else или создание объекта через оператор new. Как основы могут быть “углубленными”?

Рассмотрим следующий базовый вопрос: как создать объект в Java? Первый и самый правильный ответ: через оператор new. Что может быть более базовым в объектно ориентированном языке, чем Object object = new Object();

Теперь усложним вопрос: Как создать объект в Java без использования new? И на этот вопрос есть два ответа: Reflection и клонирование.

Можно создать объект, если у вас есть объект класса Class<Т> этого класса:
Object instance = Class.forName("java.lang.Object").newInstance(); То есть вы можете получить новый объект класса зная только название этого класса (конечно если объект типа Class<T> для этого класса может быть загружен класс-лоадером).

Можно сделать класс Clonable и вызвать protected native Object clone() класса Object. В результате вы получите копию объекта, которую для вас сделает нативный метод.

Хорошо. Еще немного усложним задачу: как создать объект в Java не вызывая его конструктор? Кто сказал, что нельзя так сделать? Так работает ObjectOutputStream, когда десериализует объект. Вызывает sun.reflect.ReflectionFactory.newConstructorForSerialization()
Фактически создавая объект произвольного класса через вызов конструктора java.lang.Object

Что еще можно углубленно-базового рассмотреть? Вот, например, области видимости переменных: public, protected, private. Интересно что о них можно углубленного рассказать? Посмотрите sun.reflect.MagicAccessorImpl. Да-да magic accessor.
Завтра мы проведем еще один День открытых дверей по Java (последний перед началом обучения новой группы). Регистрируйтесь на http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=dod2 и готовьте свои вопросы.
А поскольку мы по традиции разыграем бесплатное обучение - торопитесь скорее пройти вступительное тестирование, чтобы принять участие в розыгрыше!
Через считанные минуты начинаем трансляцию второго (и последнего) Дня открытых дверей!
Присоединяйтесь, задавайте вопросы, следите за розыгрышем бесплатного обучения среди тех, кто успешно прошел вступительное тестирование!
https://www.youtube.com/chann…/UCetgtvy93o3i3CvyGXKFU3g/live
На втором Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу!
Победителями стали: Даниил Дерут и Александр с e-mail
bagyev :)
Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!