Классы Book и User
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 78 из 87.
Задание
ЛегкоПродолжим создавать систему управления библиотекой, расширив классы Book и User из предыдущего урока. Теперь ты добавишь возможность пользователям брать книги, создав настоящую связь между этими двумя сущностями.
Ты организуешь код в трёх файлах:
Book.java: Расшири свой класс Book из предыдущего задания. Сохрани всю существующую функциональность (isbn, title, author, isAvailable с геттерами/сеттерами иgetDetails()). Теперь добавь приватное полеborrowedByтипаString, которое хранит ID пользователя, взявшего книгу (илиnull, если книга не взята). Добавь геттер дляborrowedByи сеттер, который также соответствующим образом обновляетisAvailable: когда книга взята (borrowedBy принимает значение, отличное от null), она становится недоступной; когда книгу возвращают (значение устанавливается в null), она снова становится доступной.User.java: Расшири свой класс User, чтобы отслеживать взятые книги. Сохрани существующие id, name, Constructor, геттеры иtoString(). Добавь приватное полеArrayList<Book>с именемborrowedBooks(Initialize его в Constructor). Create методborrowBook(Book book), который добавляет книгу в список пользователя и устанавливает дляborrowedByкниги ID этого пользователя. Create методreturnBook(Book book), который удаляет книгу из списка и устанавливаетborrowedByв значение null. Добавь методgetBorrowedCount(), который возвращает количество книг, которые пользователь currently имеет.Main.java: Продемонстрируй работу системы заимствования. Ты получишь пять входных данных: ISBN, title и author книги, затем ID и имя пользователя.Create Book и User с этими входными данными. Выведи details и статус доступности книги. Затем пусть пользователь возьмёт книгу. Снова выведи доступность книги, а затем того, кто её взял, в формате
Borrowed by: [userId]. Выведи количество книг у пользователя в формате[name] has [count] book(s). Наконец, пусть пользователь вернёт книгу, и выведи доступность ещё раз.
Ты получишь пять входных данных по порядку: ISBN (String), title (String), author (String), ID пользователя (String) и имя пользователя (String).
Например, для входных данных 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 и Alice результатом будет:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueЭто задание непосредственно продолжает твою предыдущую работу, добавляя важную связь между книгами и пользователями, которая делает систему библиотеки функциональной. Ты воспользуешься композицией (User "has" Books) и увидишь, как изменения одного объекта могут влиять на другой благодаря хорошо спроектированным методам!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Прочитать информацию о книге
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Прочитать информацию о пользователе
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Создать объект Book с isbn, title и author
Book book = new Book(isbn, title, author);
// Создать объект User с userId и userName
User user = new User(userId, userName);
// Вывести детали книги с помощью getDetails()
System.out.println(book.getDetails());
// Print whether the book is available (format: "Available: true" or "Available: false")
System.out.println("Available: " + book.isAvailable());
// Пусть пользователь возьмёт книгу
user.borrowBook(book);
// Снова вывести доступность книги
System.out.println("Available: " + book.isAvailable());
// Вывести, кто её взял
System.out.println("Borrowed by: " + book.getBorrowedBy());
// Вывести, сколько книг у пользователя
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Пусть пользователь вернёт книгу
user.returnBook(book);
// Вывести доступность ещё раз
System.out.println("Available: " + book.isAvailable());
}
}Все уроки раздела Объектно-ориентированное программирование
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