Klasy książki i użytkownika
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 78 z 87.
Wyzwanie
ŁatwyKontynuujmy rozbudowę systemu zarządzania biblioteką, rozszerzając klasy Book i User z poprzedniej lekcji. Teraz dodasz możliwość wypożyczania książek przez użytkowników, tworząc rzeczywiste powiązanie między tymi dwiema encjami.
Rozmieścisz swój kod w trzech plikach:
Book.java: Rozbuduj swoją klasę Book z poprzedniego wyzwania. Zachowaj wszystkie istniejące funkcje (isbn, title, author, isAvailable wraz z getterami/setterami orazgetDetails()). Dodaj teraz prywatne poleborrowedBytypuString, które przechowuje ID użytkownika, który wypożyczył książkę (lubnull, jeśli książka nie została wypożyczona). Dodaj getter dlaborrowedByoraz setter, który odpowiednio aktualizuje równieżisAvailable: gdy książka zostanie wypożyczona (borrowedByotrzyma wartość inną niżnull), staje się niedostępna; gdy zostanie zwrócona (wartość zostanie ustawiona nanull), ponownie staje się dostępna.User.java: Rozszerz swoją klasę User, aby śledziła wypożyczone książki. Zachowaj istniejące pola id, name, konstruktor, gettery oraztoString(). Dodaj prywatne poleArrayList<Book>o nazwieborrowedBooks(zainicjalizuj je w konstruktorze). Utwórz metodęborrowBook(Book book), która dodaje książkę do listy użytkownika i ustawiaborrowedByksiążki na ID tego użytkownika. Utwórz metodęreturnBook(Book book), która usuwa książkę z listy i ustawiaborrowedBynanull. Dodaj metodęgetBorrowedCount(), która zwraca liczbę książek, które użytkownik aktualnie ma.Main.java: Pokaż działanie systemu wypożyczania. Otrzymasz pięć danych wejściowych: ISBN, tytuł i autora książki, a następnie ID użytkownika i jego imię.Utwórz obiekt Book i obiekt User na podstawie tych danych wejściowych. Wyświetl szczegóły książki i jej status dostępności. Następnie wypożycz książkę użytkownikowi. Ponownie wyświetl dostępność książki, a potem informację o tym, kto ją wypożyczył, w formacie
Borrowed by: [userId]. Wyświetl liczbę książek, które ma użytkownik, w formacie[name] has [count] book(s). Na koniec zwróć książkę i jeszcze raz wyświetl jej dostępność.
Otrzymasz kolejno pięć danych wejściowych: ISBN (String), tytuł (String), autora (String), ID użytkownika (String) i imię użytkownika (String).
Na przykład dla danych wejściowych 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 i Alice wynikiem będzie:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueTo wyzwanie bezpośrednio rozwija Twoją wcześniejszą pracę, dodając kluczową relację między książkami a użytkownikami, dzięki której system biblioteczny działa. Wykorzystasz kompozycję (User „ma” Books) i zobaczysz, jak dobrze zaprojektowane metody pozwalają zmianom jednego obiektu wpływać na inny!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj informacje o książce
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Wczytaj informacje o użytkowniku
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Utwórz obiekt Book z isbn, title i author
Book book = new Book(isbn, title, author);
// Utwórz obiekt User z userId i userName
User user = new User(userId, userName);
// Wypisz szczegóły książki za pomocą getDetails()
System.out.println(book.getDetails());
// Wypisz, czy książka jest dostępna (format: "Available: true" lub "Available: false")
System.out.println("Available: " + book.isAvailable());
// Niech użytkownik wypożyczy książkę
user.borrowBook(book);
// Ponownie wypisz informację o dostępności książki
System.out.println("Available: " + book.isAvailable());
// Wypisz, kto ją wypożyczył
System.out.println("Borrowed by: " + book.getBorrowedBy());
// Wypisz, ile książek ma użytkownik
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Niech użytkownik zwróci książkę
user.returnBook(book);
// Jeszcze raz wypisz informację o dostępności książki
System.out.println("Available: " + book.isAvailable());
}
}Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik13Projekt: System zarządzania biblioteką
Przegląd projektu i projekt UMLKlasy książki i użytkownikaSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraIntegracja obsługi wyjątkówTestowanie i integracja2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online