Система выдачи книг
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 79 из 87.
Задание
ЛегкоПродолжим создавать систему управления библиотекой, реализовав полноценную систему выдачи книг с помощью класса Library, который управляет коллекцией книг и пользователей. Именно здесь ваша система начинает походить на настоящую библиотеку: отслеживает, у кого что находится, и обеспечивает соблюдение правил выдачи!
Вы распределите код по четырём файлам:
Book.java: сохраните свой class Book из предыдущего задания со всей его функциональностью: isbn, title, author, isAvailable, borrowedBy, getDetails(), а также соответствующими геттерами и сеттерами.User.java: сохраните свой class User с id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() и toString().Library.java: создайте центральный classLibrary, который управляет всем. Ваша библиотека должна поддерживать два ArrayLists: один для объектов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 book1, название book1, автор book1, ISBN book2, название book2, автор book2, 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В этом задании объединяются композиция, инкапсуляция и проектирование методов для создания целостной системы. Class 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 и UserСистема выдачи книгФункционал поискаИнтерфейс администратораИнтеграция обработки исключенийТестирование и интеграция2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово 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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java