Lớp sách và người dùng
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 78 trên 87.
Thử thách
DễHãy tiếp tục xây dựng Hệ thống quản lý thư viện bằng cách mở rộng các lớp Book và User từ bài học trước. Bây giờ, bạn sẽ thêm khả năng mượn sách cho người dùng, tạo mối liên kết thực sự giữa hai đối tượng này.
Bạn sẽ tổ chức code trong ba tệp:
Book.java: Cải thiện lớp Book từ thử thách trước. Giữ nguyên mọi chức năng hiện có (isbn, title, author, isAvailable với các phương thức getter/setter vàgetDetails()). Bây giờ, hãy thêm trường riêng tưborrowedBykiểuStringđể lưu ID của người dùng đã mượn sách (hoặcnullnếu sách chưa được mượn). Thêm phương thức getter choborrowedByvà phương thức setter đồng thời cập nhậtisAvailablecho phù hợp. Khi có người mượn sách (borrowedBy được đặt thành giá trị khác null), sách sẽ không còn khả dụng; khi sách được trả lại (đặt thành null), sách sẽ khả dụng trở lại.User.java: Mở rộng lớp User để theo dõi những cuốn sách đã mượn. Giữ nguyên id, name, hàm khởi tạo, các phương thức getter vàtoString(). Thêm trường riêng tưArrayList<Book>có tênborrowedBooks(khởi tạo trường này trong hàm khởi tạo). Tạo phương thứcborrowBook(Book book)để thêm sách vào danh sách của người dùng và đặtborrowedBycủa sách thành ID của người dùng đó. Tạo phương thứcreturnBook(Book book)để xóa sách khỏi danh sách và đặtborrowedBythành null. Thêm phương thứcgetBorrowedCount()để trả về số sách người dùng hiện đang mượn.Main.java: Minh họa hệ thống mượn sách đang hoạt động. Bạn sẽ nhận năm đầu vào: ISBN, tiêu đề và tác giả của một cuốn sách, sau đó là ID và tên người dùng.Tạo một đối tượng Book và một đối tượng User bằng các đầu vào này. In thông tin chi tiết và trạng thái khả dụng của sách. Sau đó, cho người dùng mượn sách. In lại trạng thái khả dụng của sách, rồi in ID người đã mượn sách theo định dạng
Borrowed by: [userId]. In số sách người dùng đang có theo định dạng[name] has [count] book(s). Cuối cùng, cho người dùng trả sách và in trạng thái khả dụng thêm một lần nữa.
Bạn sẽ nhận năm đầu vào theo thứ tự: ISBN (String), tiêu đề (String), tác giả (String), ID người dùng (String) và tên người dùng (String).
Ví dụ, với các đầu vào 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 và Alice, đầu ra sẽ là:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueThử thách này tiếp nối trực tiếp phần bạn đã làm trước đó, bổ sung mối quan hệ quan trọng giữa sách và người dùng để hệ thống thư viện hoạt động. Bạn sẽ sử dụng tính kết hợp (User "has" Books) và thấy cách những thay đổi ở một đối tượng có thể ảnh hưởng đến đối tượng khác thông qua các phương thức được thiết kế tốt!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc thông tin sách
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Đọc thông tin người dùng
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Tạo đối tượng (object) Book với isbn, title và author
Book book = new Book(isbn, title, author);
// Tạo đối tượng User với userId và userName
User user = new User(userId, userName);
// In ra thông tin chi tiết của sách bằng getDetails()
System.out.println(book.getDetails());
// In ra sách còn có thể mượn hay không (định dạng: "Available: true" hoặc "Available: false")
System.out.println("Available: " + book.isAvailable());
// Cho người dùng mượn sách
user.borrowBook(book);
// In lại trạng thái có thể mượn của sách
System.out.println("Available: " + book.isAvailable());
// In ra tên người đã mượn sách
System.out.println("Borrowed by: " + book.getBorrowedBy());
// In ra số sách người dùng đang có
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Cho người dùng trả sách
user.returnBook(book);
// In trạng thái có thể mượn thêm lần nữa
System.out.println("Available: " + book.isAvailable());
}
}Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh10Xử lý ngoại lệ trong OOP
Phân cấp lớp ngoại lệNgoại lệ tùy chỉnhLỗi có kiểm tra và không kiểm traMẫu try-with-resourcesÔn tập: người dùng đã xác thực13Dự án: Quản lý thư viện
Tổng quan dự án và thiết kế UMLLớp sách và người dùngHệ thống mượn sáchChức năng tìm kiếmGiao diện quản trịTích hợp xử lý ngoại lệKiểm thử và tích hợp2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online