SeniorJava Developer > Java Core > Дженерики
Короткий ответ При компиляции дженерик-информация стирается (type erasure): компилятор проверяет типы, а затем убирает их из байт-кода. Поэтому List и List после компиляции — один и тот же класс List: узнать параметр типа в рантайме нельзя. Raw type — параметризованный тип без параметра (List вместо List): он оставлен для совместимости со старым кодом, но типобезопасность теряется. Как это работает подробнее Переменная типа T заменяется своей левой границей: без указанной границы — Object, для — Animal. Параметризованный тип превращается в сырой List, а не в List. Стирание введено ради обратной совместимости: код, написанный до Java 5, должен был продолжать работать и корректно взаимодействовать с новым. Из стирания вытекают следствия: нельзя создать массив параметризованного типа (new List[1] запрещено), нельзя проверить параметр типа в рантайме; чтобы передать тип в метод, используется дополнительный аргумент Class. Raw types: компилятор выдаёт
genericsjava
MiddlePython Developer > Основы Python > Инструменты разработки
Короткий ответ Ветка в Git — это независимая линия разработки: несколько разработчиков могут работать над отдельными фичами, не затрагивая основную кодовую базу. Merge объединяет истории веток, создавая merge-коммит и сохраняя полную картину. Rebase «воспроизводит» коммиты одной ветки поверх другой, переписывая их ради линейной истории. Как это работает подробнее Обе команды интегрируют изменения из одной ветки в другую, но дают разную форму истории коммитов. Работа с ветками. git branch feature создаёт ветку, git checkout feature переключается на неё, а git merge feature вливает её в текущую. Механика merge. Слияние создаёт новый merge-коммит, история становится нелинейной, но сохраняется полная картина того, что происходило. Механика rebase. Коммиты ветки «перемещаются» и накладываются поверх другой ветки: merge-коммиты не появляются, история линейна. Практические рекомендации. Rebase удобен для чистой линейной истории в своих feature-ветках, merge предпочтителен для общих публичных веток, где историю переп
branchinggit
JuniorPython Developer > Основы Python > Модули, пакеты и окружение
Короткий ответ Виртуальное окружение — это изолированное окружение проекта: отдельная папка со своим интерпретатором и собственным набором установленных пакетов. Оно защищает системный Python от изменений и не даёт зависимостям разных проектов конфликтовать. pip — стандартный менеджер пакетов Python, который устанавливает библиотеки из репозитория PyPI. Как это работает подробнее Окружение делает проект воспроизводимым, а pip управляет его зависимостями из командной строки. Создание и активация. Окружение создают командой python -m venv myenv, активируют source myenv/bin/activate на Linux и macOS или myenv\Scripts\activate на Windows, завершают работу через deactivate. Изоляция зависимостей. Каждый проект получает собственные версии библиотек, например Django 4.0 в одном и 4.1 в другом. Менеджер pip. Название расшифровывается как «Pip Installs Packages»; pip входит в состав большинства дистрибутивов Python и вызывается, например, так: pip install requests. Фиксация зависимостей. Список пакетов сохраняют в req
packagespip
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ @property — встроенный декоратор, который объявляет метод класса как свойство: обращаться к его результату можно как к обычному атрибуту, без скобок. По сути это синтаксический сахар над функцией property(), которой передаются методы-геттер, сеттер и делетер. Как это работает подробнее Такой подход называют управляемыми атрибутами: снаружи поле выглядит обычным, а внутри допускает проверки, вычисления и логирование. Геттер. Метод, помеченный @property, возвращает значение внутреннего атрибута, который по соглашению хранится с одним подчёркиванием. Сеттер. Метод с декоратором @имя_свойства.setter вызывается при присваивании obj.attribute = value и может проверить корректность нового значения. Делетер. Метод с декоратором @имя_свойства.deleter обрабатывает оператор del obj.attribute. Типичный сценарий. Контроль доступа к атрибуту: значение хранится во внутреннем поле, а доступ к нему идёт через геттер и сеттер с валидацией. Пример кода Что использовать на практике Валидация. Используй сеттер, что
gettersoop
MiddlePython Developer > Основы Python > Генераторы и итераторы
Короткий ответ Итератор — это объект, который перебирает элементы коллекции по одному за раз и реализует протокол из методов __iter__() и __next__(). Когда элементы заканчиваются, __next__() выбрасывает StopIteration. Цикл for и функция next() как раз продвигают итератор по элементам. Как это работает подробнее Итерируемый объект и итератор выполняют разные роли: первый умеет только возвращать итератор, а второй реально осуществляет перебор. Протокол итерации. Объект считается итератором, если у него есть __iter__(), возвращающий самого себя, и __next__(), отдающий следующий элемент или бросающий StopIteration в конце. Итерируемые объекты. Списки, строки и словари итераторами не являются: функцию iter(obj) используют, чтобы получить для них отдельный итератор. Цикл for. Неявно вызывает iter(), затем повторяет next() и останавливается, когда ловит StopIteration. Пример кода Что использовать на практике Обычный обход. Для перебора коллекций достаточно цикла for — создавать итераторы вручную не нужно. Собственна
iteriterator-protocol
JuniorPython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Класс в Python — это логическая сущность, описывающая набор однотипных объектов: она содержит атрибуты (данные) и методы (поведение). Класс можно рассматривать как «чертёж», по которому создаются объекты, а объект, или экземпляр, — конкретная реализация этого чертежа со своим состоянием. Как это работает подробнее Класс объявляется ключевым словом class, после которого идут имя класса и тело с отступом. Экземпляр создаётся вызовом класса как функции: имя = ИмяКласса(аргументы). Атрибуты класса. Переменные, заданные на уровне класса, являются общими для всех экземпляров. Атрибуты экземпляра. Переменные, присвоенные через self внутри __init__(), принадлежат каждому конкретному объекту. Метод __init__. При создании экземпляра Python автоматически вызывает __init__(), который инициализирует атрибуты нового объекта. Методы. Функции внутри класса получают доступ к экземпляру через параметр self и описывают его поведение. Всё есть объект. В Python практически всё, с чем работает программист, является
classesmethods
MiddleJava Developer > Java Core > Java 8+
Короткий ответ Optional — контейнерный класс из пакета java.util, появившийся в Java 8: он содержит либо одно ненулевое значение, либо пуст. Его задача — сделать возможное отсутствие значения явным в сигнатуре метода и избавить код от бесконечных проверок на null и от NullPointerException: вместо возврата null метод возвращает Optional.empty(). Как это работает подробнее Создать Optional можно тремя способами: Optional.of(value) — только для заведомо ненулевого значения, иначе сразу NullPointerException; Optional.ofNullable(value) — допускает null и превращает его в пустой Optional; Optional.empty() — пустой контейнер. Для проверки наличия значения есть isPresent() и isEmpty() (с Java 11). Для безопасного получения — orElse(default), orElseGet(supplier), когда значение по умолчанию вычисляется лениво, и orElseThrow(). Методы map(), filter() и flatMap() позволяют преобразовывать значение внутри контейнера без проверок. Optional активно используется в Stream API: findFirst(), max() и другие терминальные операци
javajava-8
JuniorJava Developer > Java Core > Основы Java
Короткий ответ Класс-обёртка — это ссылочный тип, который упаковывает примитив в объект: int → Integer, long → Long, char → Character, boolean → Boolean. Обёртки нужны там, где требуется объект, а не значение: коллекции и дженерики хранят только объекты. Преобразование автоматическое: автобоксинг упаковывает примитив в обёртку, распаковка делает обратное. Как это работает подробнее Помимо «объектности», обёртки дают полезную функциональность: константы вроде Integer.MAX_VALUE, методы преобразования Integer.parseInt("42") и Integer.valueOf(...), а также возможность хранить null для обозначения отсутствия значения. Автобоксинг — автоматическая упаковка примитива при присваивании или добавлении в коллекцию. Распаковка — автоматическое извлечение примитива; для null-обёртки даёт NullPointerException. Кэш значений — Integer от -128 до 127 кэшируется, поэтому == для обёрток даёт неожиданные результаты. Функциональность — константы, парсинг и преобразование типов, например Integer.parseInt() и valueOf(). Пример кода
autoboxinginteger
MiddlePython Developer > Основы Python > Исключения и контекстные менеджеры
Короткий ответ Контекстный менеджер — объект, который гарантирует корректное освобождение ресурсов вроде файлов и соединений с помощью оператора with. Метод __enter__() выполняется при входе в блок, а __exit__() — при выходе, который происходит всегда, даже если возникло исключение. Как это работает подробнее Конструкция with избавляет от ручной очистки ресурсов и заменяет громоздкие связки try/finally. События входа и выхода. Код внутри with выполняется между __enter__() и __exit__(), а выход гарантирован и при нормальном завершении, и при ошибке. Сигнатура __exit__(). Метод принимает тип исключения, значение и traceback; если ошибки не было, все три аргумента равны None. Классический пример. open() возвращает контекстный менеджер: файл автоматически закрывается на выходе из блока, вызывать close() явно не нужно. Цена утечки. Без закрытия ресурсов система может исчерпать файловые дескрипторы и соединения, замедлиться или упасть. Пример кода Что использовать на практике Файлы и соединения. Работай с ними чере
context-managersenter-exit
SeniorPython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Корутина — функция, которая умеет приостанавливать выполнение в точке ожидания и возобновлять его позже. Объявляется через async def, а запускается через await из другой корутины или через asyncio.run(). Как это работает подробнее Современные корутины развились из генераторов с yield, а синтаксис async/await появился в Python 3.5. Приостановка. await «замораживает» корутину до готовности ожидаемой операции, а управление в это время получает цикл событий. Запуск. При вызове корутина возвращает объект корутины, поэтому выполнить её код можно только через цикл событий. Происхождение. Исторически корутины выросли из генераторов, поддерживающих yield. Применение. Корутины уместны там, где много ожидания ввода-вывода: сетевые запросы, чтение файлов, обращения к базам данных и API. Пример кода Что использовать на практике Конкурентный запуск. Объединяй несколько корутин через asyncio.gather() для параллельных запросов. Структура. Дроби асинхронную логику на небольшие корутины с понятными именами. Ожид
asyncioawait