SeniorJava Developer > Java Core > JPA и Hibernate
Короткий ответ EAGER и LAZY — две стратегии загрузки ассоциаций, определяющие, когда данные связей извлекаются из базы. При жадной загрузке связанные данные приходят сразу вместе с основной сущностью; при ленивой — Hibernate подставляет прокси или коллекцию-обёртку, а запрос выполняется только в момент реального обращения к свойству. Стратегия задаётся атрибутом fetch аннотации связи. Как это работает подробнее Ленивая загрузка экономит память и число запросов, когда связь может не понадобиться, но требует открытой сессии в момент обращения к свойству. Если обратиться к ленивой связи, когда Session или persistence context уже закрыт, Hibernate выбрасывает LazyInitializationException. По умолчанию: @ManyToOne — EAGER, @OneToMany и @ManyToMany — LAZY. LazyInitializationException: «could not initialize proxy - no Session» — возникает, например, при чтении сущности в контроллере вне границ @Transactional, когда сессия из сервиса уже закрыта. Решения: обращаться к ленивым связям внутри транзакции или открытой сесс
eagerhibernate
JuniorJava Developer > Java Core > Java 8+
Короткий ответ Лямбда-выражение — это анонимная функция: блок кода без имени, который можно передавать как значение, например в аргументы метода. В Java 8 оно записывается как список параметров, стрелка и тело. Лямбда реализует единственный абстрактный метод функционального интерфейса, а типы параметров и возвращаемого значения компилятор выводит автоматически (type inference) из контекста. Как это работает подробнее Функциональный интерфейс (SAM-интерфейс) — это интерфейс ровно с одним абстрактным методом; в нём могут быть также статические и default-методы. Аннотация @FunctionalInterface необязательна, но позволяет компилятору проверить, что интерфейс действительно функциональный. До Java 8 такое поведение реализовывали анонимными внутренними классами; лямбда — более компактная альтернатива им. Встроенные примеры — Runnable, Comparator, Callable, а в Java 8 добавлены Function, Consumer, Supplier, Predicate и другие интерфейсы пакета java.util.function. Лямбда не создаёт новый уровень вложенности, как аноним
anonymous-classfunctional-interface
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Магические, или dunder (от double underscore), методы — специальные методы, имена которых начинаются и заканчиваются двумя подчёркиваниями: __init__, __str__, __eq__, __call__. Программист не вызывает их явно — их запускают встроенные функции и синтаксические конструкции языка. Как это работает подробнее Язык связывает операции с методами автоматически, поэтому, определив нужный метод, класс получает стандартное поведение. Неявный вызов. len(obj) обращается к __len__(), оператор + — к __add__(), а оператор == — к __eq__(). Основные методы. __init__() инициализирует объект, __call__() делает экземпляр вызываемым как функцию, а __str__() и __repr__() задают строковые представления. Разница str и repr. __str__() возвращает человекочитаемое представление для print(), а __repr__() — однозначное официальное для отладки, по которому объект в идеале можно восстановить. Запасной вариант. Если __str__ не определён, print() использует __repr__, поэтому хорошей практикой считается реализовать хотя бы __rep
dunder-methodsmagic-methods
MiddleJava Developer > Java Core > ООП
Короткий ответ Множественное наследование — ситуация, когда один класс может иметь более одного непосредственного родителя и наследовать поля и методы сразу от нескольких классов, например class Child extends Mother, Father. Java его не поддерживает: наследование классов одиночное. Зато класс может реализовывать любое количество интерфейсов. Как это работает подробнее Главная причина запрета — проблема ромба (diamond problem): если два родительских класса имеют метод с одинаковой сигнатурой, непонятно, какую реализацию должен унаследовать потомок и как корректно разрешить конфликт. Интерфейсы. Класс может реализовывать несколько интерфейсов: implements A, B, C. Начиная с Java 8 интерфейсы могут содержать default-методы с реализацией. Разрешение конфликта. Если два интерфейса предоставляют default-методы с одинаковой сигнатурой, класс обязан переопределить метод явно, например вызвав A.super.method(). Композиция как альтернатива. Вместо жёсткого наследования поведение часто встраивают через объекты других клас
default-methodsdiamond-problem
SeniorJava Developer > Java Core > Multithreading
Короткий ответ Модель памяти Java — это набор формальных правил и гарантий, определяющих, как потоки взаимодействуют через память и какие результаты чтения и записи они обязаны «видеть», чтобы программа вела себя предсказуемо на разных процессорах и операционных системах. Центральное понятие — отношение happens-before: если действие A happens-before действия B, то результат A гарантированно виден действию B, и A не будет переупорядочено после B. Как это работает подробнее Без JMM компилятор, JIT и процессор могли бы свободно переупорядочивать операции и кэшировать значения, из-за чего поведение многопоточной программы зависело бы от конкретного железа. JMM определяет, какие переупорядочивания запрещены и какие гарантии видимости даёт Java. Основные правила happens-before: порядок действий внутри одного потока (program order); освобождение монитора happens-before последующий захват того же монитора другим потоком; запись в volatile-переменную happens-before последующее чтение той же переменной другим потоком;
happens-beforejava
JuniorPython Developer > Основы Python > Модули, пакеты и окружение
Короткий ответ Модуль — это отдельный файл с кодом на Python, содержимое которого переиспользуют через оператор import. Пакет — каталог, где хранится несколько связанных модулей; он структурирует код и служит пространством имён. Чтобы каталог считался пакетом, в нём должен быть файл __init__.py. Как это работает подробнее Модули и пакеты позволяют разбивать большую программу на логические части, упрощая разработку, тестирование и поиск ошибок. Модуль. Файл с расширением .py, работающий как небольшая библиотека, например стандартный math с функциями вроде sqrt() и константой pi. Пакет. Каталог с несколькими связанными модулями и вложенными подкаталогами-пакетами, который выступает пространством имён, например пакет numpy. Файл __init__.py. Может быть пустым или содержать код инициализации пакета; он автоматически выполняется при импорте. Переиспользование. Импортируя модули и пакеты, код не дублируется, а подключается в другие программы через import. Пример кода Что использовать на практике Структура проекта.
importmodules
JuniorPython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Наследование — механизм объектно-ориентированного программирования, при котором новый дочерний класс строится на основе родительского и наследует его атрибуты и методы. Дочерний класс может добавлять собственные члены и переопределять унаследованные, а базовый класс указывается в скобках после имени потомка. Как это работает подробнее Термины. Класс, от которого наследуют, называют базовым или родительским, а новый — производным, дочерним или подклассом. Синтаксис. Наследование задаётся именем родителя в скобках после имени потомка, например class Dog(Animal). Переиспользование. Потомок получает все атрибуты и методы родителя, а изменения в родительском классе автоматически распространяются на наследников. Виды наследования. Python поддерживает и одиночное, и множественное наследование, в отличие от ряда других языков. Пример кода Что использовать на практике Общие члены. Выноси в базовый класс атрибуты и методы, общие для всех потомков, чтобы не дублировать код. Переопределение. Когда поведени
classesinheritance
JuniorJava Developer > Java Core > ООП
Короткий ответ Объект — это экземпляр класса: если класс это шаблон или чертёж, описывающий поля и методы, то объект — конкретная реализация шаблона с собственным набором значений полей. Например, класс Car описывает свойства машины, а объект — конкретную машину с моделью и цветом. Объект создаётся оператором new, также его можно получить рефлексией, клонированием или десериализацией. Как это работает подробнее Каждый объект занимает собственную область памяти в куче и имеет состояние, отличное от состояния других объектов того же класса. Важно различать объект и ссылку: переменная объектного типа хранит не сам объект, а ссылку — «адрес», по которому объект лежит в памяти. Ссылку можно переназначить на другой объект или в null, а на один объект могут одновременно указывать несколько ссылок. Класс — шаблон: какие поля и методы есть у сущности. Объект — экземпляр с конкретными значениями полей; размещается в куче. Ссылка — переменная, указывающая на объект; может быть переназначена или равна null. java.lang.Obj
classheap
JuniorPython Developer > Основы Python > Модули, пакеты и окружение
Короткий ответ Оператор import подключает модуль целиком, и обращения к его объектам идут через имя с точкой, например math.sqrt(16). Оператор from...import переносит выбранные имена прямо в текущее пространство имён, после чего они используются без имени модуля. Синтаксис: from имя_модуля import имя1, имя2. Как это работает подробнее Выбор между двумя операторами — вопрос читаемости и контроля пространства имён. Импорт целиком. import делает происхождение имён очевидным, но требует длинных квалифицированных обращений. Импорт имён. from...import сокращает код, однако при неудачных именах возможны коллизии. Импорт звёздочкой. from module import * заносит все имена разом, загрязняет пространство имён и может переопределить существующие имена. Псевдонимы. Длинные или конфликтующие имена переименовывают через as, например import numpy as np. Особенность импорта. При import a.b имя b должно быть модулем или пакетом, тогда как from a import b позволяет импортировать и произвольное имя, объявленное в пакете. Пример
from-importimport
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ Отрицательные индексы нумеруют элементы с конца последовательности: -1 — последний элемент, -2 — предпоследний и так далее. Они поддерживаются всеми встроенными последовательностями и избавляют от вычисления длины при доступе к «хвосту» данных. Как это работает подробнее При положительной индексации отсчёт идёт от начала, при отрицательной — от конца коллекции. Сопоставление. Индекс -1 соответствует последнему элементу, а индекс, равный минус длине коллекции, — первому, поэтому фактический размер знать не нужно. Поддержка. Отрицательная индексация работает для списков, кортежей и строк. Сочетание со срезами. Отрицательные индексы применимы и в срезах: arr[-3:] возвращает три последних элемента, а arr[::-1] разворачивает последовательность. Пример кода Что использовать на практике Последний элемент. Вместо arr[len(arr) - 1] пиши arr[-1]: это короче, читаемее и не зависит от размера коллекции. Хвост данных. Получай последние элементы очереди, конец строки и другие «хвостовые» данные отрицательным
indiceslists