Этот репозиторий содержит решения комплексных учебных заданий, направленных на освоение и закрепление фундаментальных и продвинутых концепций языка программирования Java. Каждое задание представляет собой отдельный мини-проект, демонстрирующий различные аспекты ООП, работы со структурами данных и современными API языка.
- Задание 1: Основы ООП — Класс
BankAccount
- Задание 2: Структуры данных и Stream API — Управление автопарком
- Задание 3: Продвинутое ООП — Система бронирования номеров
- Задание 4: Функциональное программирование и Рефлексия
Проект, демонстрирующий базовые принципы объектно-ориентированного программирования через создание и управление банковским счетом.
- Создание классов и объектов.
- Конструкторы и инициализация полей.
- Методы и логика инкапсуляции.
- Работа с датой и временем (
LocalDateTime
). - Переопределение методов класса
Object
(toString
,equals
,hashCode
). - Генерация случайных чисел (
Random
).
- Класс
BankAccount
со полями:ownerName
,balance
,openDate
,isLocked
. - Конструктор, который инициализирует счет с начальным балансом и генерирует уникальный 8-значный номер счета.
- Методы для управления счетом:
deposit(amount)
: для пополнения счета.withdraw(amount)
: для снятия средств с проверкой на достаточный баланс.transfer(otherAccount, amount)
: для перевода средств на другой счет.
- Переопределен метод
toString()
для удобного вывода информации о счете. - Переопределены методы
equals()
иhashCode()
для корректного сравнения объектов счетов.
Комплексное задание, охватывающее работу с массивами, коллекциями и Stream API для анализа и управления данными об автомобилях.
- Массивы: Создание, итерация, фильтрация.
- Коллекции:
List
,Set
,HashSet
,Map
. Удаление дубликатов, сортировка, модификация. equals()
/hashCode()
: Обеспечение уникальности объектов в коллекциях по кастомному полю (VIN).Comparable<T>
: Реализация интерфейса для кастомной сортировки объектов.- Stream API: Фильтрация (
filter
), сортировка (sorted
), ограничение выборки (limit
), агрегатные операции (average
), группировка (groupingBy
). - Интерактивное консольное приложение: Использование
Scanner
для создания меню.
- Работа с массивами:
- Создан массив с годами выпуска 50 случайных машин.
- Реализован вывод машин, выпущенных после 2015 года, и подсчет среднего возраста авто.
- Работа с коллекциями:
- Список моделей обработан для удаления дубликатов.
- Данные отсортированы в обратном алфавитном порядке.
- Реализована замена моделей "Tesla" на "ELECTRO_CAR".
- Сравнение автомобилей:
- Создан класс
Car
с полями VIN, модель, производитель и т.д. equals()
иhashCode()
переопределены для сравнения только по VIN, что обеспечивает уникальность машин вHashSet
.- Реализован
Comparable<Car>
для сортировки по году выпуска.
- Создан класс
- Анализ с помощью Stream API:
- Реализованы фильтрация, сортировка и вывод топ-3 самых дорогих машин с пробегом менее 50 000 км.
- Подсчитан средний пробег всех машин.
- Автомобили сгруппированы по производителю в
Map<String, List<Car>>
.
- Система "Автоцентр":
- Создан класс
CarDealership
для управления списком машин. - Реализовано интерактивное меню для вызова методов: добавление машины (с проверкой на дубликаты по VIN), поиск по производителю, расчет средней цены по типу, получение статистики и т.д.
- Создан класс
Проект, демонстрирующий глубокое понимание ООП, включая абстракцию, наследование, дженерики и обработку исключений на примере системы отеля.
- Наследование и Абстракция: Построение сложной иерархии классов с использованием
abstract class
(Room
,ProRoom
). - Интерфейсы: Определение контрактов для сервисного слоя (
RoomService
). - Дженерики (Generics): Использование ограниченных дженериков (
<T extends Room>
,<T extends LuxRoom>
) для создания гибких и типобезопасных сервисов. - Перечисления (Enum): Создание
enum
с полями и методами для централизованного и безопасного управления ценами. - Кастомные исключения: Создание и использование собственного непроверяемого исключения (
RoomIsBookedException
). - Разделение ответственности (SoC): Четкое разделение "данных" (классы комнат) и "поведения" (сервисные классы).
- Иерархия классов комнат (
EconomyRoom
,StandardRoom
,LuxRoom
,UltraLuxRoom
). - Запрет на создание экземпляров абстрактных классов
Room
иProRoom
. - Сервисный слой:
- Интерфейс
RoomService<T extends Room>
с методамиclean
,reserve
,free
. - Класс
HotelRoomService
как основная реализация сервиса.
- Интерфейс
- Обработка ошибок: При попытке забронировать занятую комнату выбрасывается
RoomIsBookedException
. - Дополнительные задания:
- Цены через
enum
: Создано перечислениеPrices
, и вся логика установки цен переведена на его использование. - Расширенный сервис:
- Создан интерфейс
LuxRoomService
, который наследуется отRoomService
и добавляет методfoodDelivery
. - Создан класс
PremiumHotelService
, реализующий новый интерфейс и работающий только сLuxRoom
и его наследниками. - В
Main
классе продемонстрирована типобезопасность системы: попытка заказать еду вEconomyRoom
черезPremiumHotelService
приводит к ошибке компиляции.
- Создан интерфейс
- Цены через
Это задание посвящено двум мощным механизмам Java: лямбда-выражениям и Reflection API. Работа разделена на две части: практическое применение стандартных функциональных интерфейсов и создание собственных аннотаций с их последующей обработкой.
- Лямбда-выражения: Написание анонимных функций для реализации функциональных интерфейсов.
- Функциональные интерфейсы: Глубокое понимание и практическое использование:
Predicate<T>
: для создания условий и фильтрации (включая композицию сand()
иor()
).Consumer<T>
: для выполнения действий над объектом (включая цепочки вызовов сandThen()
).Function<T, R>
: для преобразования данных из одного типа в другой.Supplier<T>
: для генерации или поставки данных.
- Кастомные аннотации: Создание собственных аннотаций с параметрами с использованием мета-аннотаций
@Retention(RUNTIME)
и@Target
. - Reflection API:
- Анализ метаданных классов, методов и полей во время выполнения.
- Чтение аннотаций с классов и их членов (
isAnnotationPresent
,getAnnotation
). - Динамический доступ к полям объекта, включая приватные (
getDeclaredFields
,setAccessible
,get
).
- Работа с лямбда-выражениями:
- Созданы и продемонстрированы лямбда-выражения для всех основных функциональных интерфейсов из пакета
java.util.function
. - Реализованы проверки строк, обработка объектов и генерация данных с помощью лаконичного функционального синтаксиса.
- Созданы и продемонстрированы лямбда-выражения для всех основных функциональных интерфейсов из пакета
- Кастомная аннотация
@DeprecatedEx
:- Создана аннотация, имитирующая стандартную
@Deprecated
, но с обязательным сообщением об альтернативе. - Написан обработчик
AnnotationProcessor
, который через рефлексию находит все помеченные классы и методы и выводит предупреждающие сообщения в консоль.
- Создана аннотация, имитирующая стандартную
- Кастомная сериализация в JSON с аннотацией
@JsonField
:- Создана аннотация
@JsonField
, позволяющая задать имя поля для JSON-вывода. - Реализован класс
JsonSerializer
, который:- Принимает любой объект.
- Через рефлексию находит все поля, помеченные
@JsonField
. - Получает доступ к
private
полям с помощьюfield.setAccessible(true)
. - Извлекает значения этих полей и формирует из них корректную JSON-строку.
- Создана аннотация