Этот репозиторий содержит решения комплексных учебных заданий, направленных на освоение и закрепление фундаментальных и продвинутых концепций языка программирования 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-строку.
- Создана аннотация