💻 Хочешь MacBook Pro? Просто начни учиться!
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня);
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня);
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
❤1👾1
JEP 431 добавил в Java то, чего не хватало с самого начала, а именно единый интерфейс для упорядоченных коллекций. Разберем, что изменилось под капотом.
🔹 Проблема, которую игнорировали
До Java 21 List и Deque имеют порядок обхода, но их общий суперинтерфейс Collection - нет. Set не гарантирует порядок, но LinkedHashSet и SortedSet — гарантируют. Единого API для "дай первый/последний элемент" или "обход в обратном порядке" не существовало.
Результат? Костыли:
// До Java 21
list.get(0) // List
deque.getFirst() // Deque
sortedSet.first() // SortedSet
linkedHashSet.iterator().next() // LinkedHashSet
🔹 Три новых интерфейса
JEP 431 внедрил в иерархию коллекций три интерфейса:
interface SequencedCollection<E> extends Collection<E> {
SequencedCollection<E> reversed();
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
interface SequencedSet<E> extends SequencedCollection<E>, Set<E> {
SequencedSet<E> reversed();
}
interface SequencedMap<K,V> extends Map<K,V> {
SequencedMap<K,V> reversed();
Map.Entry<K,V> firstEntry();
Map.Entry<K,V> lastEntry();
Map.Entry<K,V> pollFirstEntry();
Map.Entry<K,V> pollLastEntry();
// ... и другие методы
}
Все методы (кроме reversed()) - это default методы, промоутнутые из Deque. Это обеспечило обратную совместимость.
▪️ Важнейший нюанс: reversed() возвращает view, а не копию.
Изменения в оригинале видны в reversed view. Под капотом это lightweight wrapper, который инвертирует индексы при обращении.
🔹 Интеграция в иерархию
Collection<E>
└─ SequencedCollection<E>
├─ List<E>
├─ Deque<E>
└─ Set<E>
└─ SequencedSet<E>
└─ SortedSet<E>
└─ NavigableSet<E>
Map<K,V>
└─ SequencedMap<K,V>
└─ SortedMap<K,V>
└─ NavigableMap<K,V>
🔹 SortedSet и SortedMap
SortedSet и SortedMap теперь имплементируют sequenced интерфейсы, но есть нюанс: методы addFirst()/addLast()/putFirst()/putLast() существуют лишь для того, чтобы бросить UnsupportedOperationException.
Liskov Substitution Principle: "Am I a joke to you?"
Но справедливости ради — Java Collections делает так уже давно:
— map.keySet().add() → UnsupportedOperationException
— Arrays.asList().add() → UnsupportedOperationException
— Collections.unmodifiableList().set() → UnsupportedOperationException
Это называется optional operations — когда методы есть, но работать не обязаны. Документация прямо говорит:
Many methods will throw UnsupportedOperationException if the operation cannot be performed.
Альтернативы были хуже: либо создавать зоопарк из ReadOnlySequencedSet, MutableSequencedSet, PartiallyMutableSequencedSet, либо оставить SortedSet за бортом единообразного API.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4❤2
Forwarded from Библиотека задач по Java | тесты, код, задания
Что будет результатом кода?
Anonymous Quiz
6%
true, true, true, true
67%
true, false, true, false
9%
true, true, true, false
10%
false, false, false, false
8%
Посмотреть ответ
👍4🔥3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14👍5🔥1🎉1
🛒 Black Friday от Proglib.academy!
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
Чистый, масштабируемый и поддерживаемый код — не просто идеал, а необходимость. SOLID помогает писать архитектуру, которая выдерживает рост и изменения без боли 👇
🧩 Каждый класс отвечает за что-то одно.
📍 Пример: Employee хранит данные сотрудника, но не считает зарплату — этим занимается PayrollService.
🧱 Класс открыт для расширения, но закрыт для изменения.
📍 Пример: интерфейс Shape с методом calculateArea().
Новые фигуры (Circle, Rectangle) добавляются без правки существующего кода.
🦆 Подкласс должен полностью заменять родителя, не ломая логику.
📍 Пример: если Bird умеет fly(), то Sparrow должен уметь летать.
Но Penguin не должен наследовать fly() — нарушает LSP.
🔌 Не заставляй клиентов реализовывать лишние методы.
📍 Пример: вместо интерфейса Worker с work() и eat(),
разделите его на Workable и Eatable.
Робот реализует только Workable, человек — оба.
⚙️ Зависим от абстракций, а не от реализаций.
📍 Пример: Switch работает с интерфейсом Switchable.
Ему всё равно, включает ли он лампу (LightBulb) или вентилятор (Fan).
💡 Освоив SOLID, вы начнёте проектировать системы,
которые не боятся изменений и масштабируются без боли.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37💯9🔥5👍4🤔1
Forwarded from Библиотека собеса по Java | вопросы с собеседований
В Kafka существует три уровня гарантий доставки сообщений:
Выбор зависит от задачи: для логов подойдет
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4👏2❤1
Record-классы появились в Java 14 (вначале как preview, позже стабилизированы) и стали настоящим спасением от шаблонного кода.
Это лаконичный способ описать неизменяемые data-классы — без десятков строк с конструкторами, equals(), hashCode() и toString().
🔹 Зачем они нужны
Раньше, чтобы описать простой объект вроде User, нужно было писать шаблонный код:
class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// геттеры, equals, hashCode, toString...
}
С record это выглядит так:
record User(String name, int age) {}И всё — у вас уже есть:
— конструктор, геттеры, equals(), hashCode(), toString();
— неизменяемость полей;
— компактность и читаемость.
🔹 Ключевые моменты
▪️ record — это специальный вид класса, унаследованный от java.lang.Record.
▪️ Все поля — final, сеттеров нет.
▪️ Можно добавить собственные методы и статические фабрики.
▪️ Можно переопределить канонический конструктор для валидации.
▪️ Можно объявлять вложенные рекорды и использовать их в switch или pattern matching.
🔹 Под капотом
Record — это не просто “синтаксический сахар”. JVM видит его как финальный класс с приватными финальными полями и стандартными методами, но запрещает наследование (final) и предполагает неизменность.
Так JVM и JIT могут делать агрессивные оптимизации — объекты рекордов живут меньше, быстрее создаются и не требуют избыточных проверок на изменение состояния.
🔹 Подводные камни
— Record ≠ DTO везде
Если вы сериализуете/десериализуете через фреймворки (Jackson, JPA), убедитесь, что они поддерживают record (современные версии — да).
— Проблемы с неймингом
Для рекордов автоматически создаются методы-геттеры без префикса get. Например, для record User(String name) будет метод name(), а не getName().
Это ломает привычные JavaBean-паттерны и может вызвать проблемы с библиотеками, которые ожидают именно getName().
— Не подходит, если нужен мутабельный объект.
Для билдера или ORM-энтити используйте обычный класс.
— Не добавляйте бизнес-логику внутрь record.
Это data-контейнер, а не доменная сущность.
— DTO между слоями;
— Результаты запросов к БД (projection);
— Ответы REST API;
— Ключи в Map и Set;
— В тестах и утилитах для временных структур.
— На практике редко используется из-за проблем с неймингом.
— Для ORM-сущностей, билдера, и изменяемых структур.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1🔥1👏1
Знаете, в чём самая частая ловушка автоматизации?
Слить ресурсы в “идеальный” фреймворк, который годами будет поддерживать один энтузиаст, а ценности почти не даст.
Второй сценарий — пытаться всё автоматизировать вручную, игнорируя современные инструменты на базе ИИ, и внезапно оказаться в хвосте “конвейера тестов”.
Хотите выбраться из этого круга?
👨💻13 ноября в 20:00 собираемся на Практикум! Спикер: Павел Балахонов, 15+ лет автоматизации.
Узнаем:
— Что реально даёт платформа управления автотестами с ИИ, а где скрыты грабли.
— Когда “универсальный фреймворк” превращается в долгострой и почему ИИ — не просто модный хайп, а must-have в современных проектах.
Обсудим:
— Как не слить ресурсы в “универсальный” фреймворк без профита
— Почему платформа автотестирования = гибкость, а не компромисс
— Как реально внедрять ИИ: практика и подводные камни
— Почему распределение автотестов по потокам — это новый “золотой стандарт”
— И бонус — где платформы с ИИ реально экономят время команды
🎁Бонусы для всех участников:
7% скидка на любой курс OTUS
Настольный гайд: “Использование базовых команд Docker CLI”
Подборка musy-have уроков для middle+ QA
Дата: 13 ноября, 20:00
Органиченное количество мест - успейте: https://tglink.io/9d45888b7d1b
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHUDAmv
Слить ресурсы в “идеальный” фреймворк, который годами будет поддерживать один энтузиаст, а ценности почти не даст.
Второй сценарий — пытаться всё автоматизировать вручную, игнорируя современные инструменты на базе ИИ, и внезапно оказаться в хвосте “конвейера тестов”.
Хотите выбраться из этого круга?
👨💻13 ноября в 20:00 собираемся на Практикум! Спикер: Павел Балахонов, 15+ лет автоматизации.
Узнаем:
— Что реально даёт платформа управления автотестами с ИИ, а где скрыты грабли.
— Когда “универсальный фреймворк” превращается в долгострой и почему ИИ — не просто модный хайп, а must-have в современных проектах.
Обсудим:
— Как не слить ресурсы в “универсальный” фреймворк без профита
— Почему платформа автотестирования = гибкость, а не компромисс
— Как реально внедрять ИИ: практика и подводные камни
— Почему распределение автотестов по потокам — это новый “золотой стандарт”
— И бонус — где платформы с ИИ реально экономят время команды
🎁Бонусы для всех участников:
7% скидка на любой курс OTUS
Настольный гайд: “Использование базовых команд Docker CLI”
Подборка musy-have уроков для middle+ QA
Дата: 13 ноября, 20:00
Органиченное количество мест - успейте: https://tglink.io/9d45888b7d1b
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHUDAmv
🥱1