Классы 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, конструктор, геттеры иtoString(). Добавьте приватное полеArrayList<Book>с именемborrowedBooks(инициализируйте его в конструкторе). Создайте методborrowBook(Book book), который добавляет книгу в список пользователя и устанавливаетborrowedByкниги в значение ID этого пользователя. Создайте методreturnBook(Book book), который удаляет книгу из списка и устанавливаетborrowedByв null. Добавьте методgetBorrowedCount(), который возвращает количество книг, имеющихся у пользователя в данный момент.Main.java: Продемонстрируйте работу системы выдачи книг. Вы получите пять входных данных: ISBN, название, автор книги, затем ID пользователя и имя.Создайте Book и User на основе этих входных данных. Выведите сведения о книге и статус ее доступности. Затем пусть пользователь возьмет книгу. Снова выведите доступность книги, а затем информацию о том, кто ее взял, в формате
Borrowed by: [userId]. Выведите количество книг у пользователя в формате[name] has [count] book(s). Наконец, пусть пользователь вернет книгу, и выведите доступность еще раз.
Вы получите пять входных данных по порядку: ISBN (String), название (String), автор (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 "есть" 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, названием и автором
Book book = new Book(isbn, title, author);
// Создание объекта User с userId и userName
User user = new User(userId, userName);
// Вывод сведений о книге с помощью getDetails()
System.out.println(book.getDetails());
// Вывод доступности книги (формат: "Available: true" или "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 и 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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»