Система выдачи книг
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 79 из 87.
Задание
ЛегкоДавайте продолжим создание системы управления библиотекой, разработав полноценную систему выдачи книг с классом Library, который управляет коллекцией книг и пользователями. Именно здесь ваша система начинает напоминать настоящую библиотеку — отслеживание того, у кого что находится, и соблюдение правил заимствования!
Вы организуете свой код в четырех файлах:
Book.java: Сохраните свой класс Book из предыдущего задания со всей его функциональностью — isbn, title, author, isAvailable, borrowedBy, getDetails() и соответствующими геттерами/сеттерами.User.java: Сохраните свой класс User с id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() и toString().Library.java: Создайте центральный классLibrary, который управляет всем процессом. Ваша библиотека должна содержать два ArrayList — один для объектовBookи один для объектовUser. Включите следующие методы:addBook(Book book)— добавляет книгу в коллекцию библиотеки.registerUser(User user)— добавляет пользователя в список зарегистрированных пользователей библиотеки.findBookByIsbn(String isbn)— ищет среди книг и возвращает Book с соответствующим ISBN илиnull, если книга не найдена.findUserById(String id)— ищет среди пользователей и возвращает User с соответствующим ID илиnull, если пользователь не найден.borrowBook(String userId, String isbn)— находит пользователя и книгу, затем, если оба существуют и книга доступна, оформляет выдачу книги пользователю и выводит[userName] borrowed [bookTitle]. Если книга недоступна, выводитBook not available. Если пользователь или книга не найдены, выводитInvalid user or book.returnBook(String userId, String isbn)— находит пользователя и книгу, затем оформляет возврат книги пользователем и выводит[userName] returned [bookTitle]. Если пользователь или книга не найдены, выводитInvalid user or book.Main.java: Объедините вашу библиотечную систему! Вы получите входные данные для двух книг (ISBN, название, автор для каждой), одного пользователя (ID, имя), а затем серию операций.Создайте Library, добавьте обе книги и зарегистрируйте пользователя. Затем обработайте операции — вы получите строку, разделенную запятыми, где каждая операция отформатирована как
borrow:userId:isbnилиreturn:userId:isbn.После обработки всех операций выведите сводку, показывающую статус каждой книги в формате
[isbn]: [Available/Borrowed].
Вы получите входные данные в следующем порядке: ISBN книги 1, название книги 1, автор книги 1, ISBN книги 2, название книги 2, автор книги 2, ID пользователя, имя пользователя и, наконец, строка операций.
Например, при входных данных ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice и borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, ваш вывод будет следующим:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedЭта задача объединяет композицию, инкапсуляцию и проектирование методов для создания целостной системы. Класс Library выступает в роли координатора, делегируя логику заимствования классам User и Book, одновременно управляя всей коллекцией!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Чтение информации о книге 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Чтение информации о книге 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Чтение информации о пользователе
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Чтение строки операций (разделенных запятыми, формат: borrow:userId:isbn или return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Создать объекты Book для book1 и book2
// TODO: Создать объект User
// TODO: Создать Library, добавить обе книги и зарегистрировать пользователя
// TODO: Разделить operationsStr по "," и обработать каждую операцию
// Для каждой операции разделить по ":" для получения action, userId, isbn
// Вызвать library.borrowBook() или library.returnBook() соответственно
// TODO: Вывести сводку для каждой книги в формате "[isbn]: [Available/Borrowed]"
}
}Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User13Проект: Управление библиотекой
Обзор проекта и UML-проектированиеКлассы Book и User2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»