Menu
Coddy logo textTech

BookクラスとUserクラス

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 78/87。

challenge icon

チャレンジ

簡単

前のレッスンで作成した Book クラスと User クラスを拡張して、Library Management System の構築を続けましょう。今回は、ユーザーが本を借りられる機能を追加し、この2つのエンティティの間に実際のつながりを作ります。

コードは3つのファイルに分けて整理します。

  • Book.java:前のチャレンジで作成した Book クラスを拡張します。既存のすべての機能(isbn、title、author、getter/setter を備えた isAvailable、そして getDetails())を維持してください。今回は、型が StringborrowedBy という private フィールドを追加します。このフィールドには、その本を借りたユーザーの ID(借りられていない場合は null)を保存します。borrowedBy の getter と、isAvailable も適切に更新する setter を追加してください。本が借りられたとき(borrowedBy に null 以外の値が設定されたとき)は利用できない状態になり、返却されたとき(null に設定されたとき)は再び利用可能になります。
  • User.java:借りた本を追跡できるように User クラスを拡張します。既存の id、name、コンストラクター、getter、そして toString() を維持してください。borrowedBooks という名前の private ArrayList<Book> フィールドを追加し、コンストラクターで初期化します。指定された本をユーザーのリストに追加し、その本の borrowedBy にこのユーザーの ID を設定する borrowBook(Book book) メソッドを作成してください。リストから本を削除し、borrowedBy を null に設定する returnBook(Book book) メソッドを作成してください。ユーザーが現在所持している本の冊数を返す getBorrowedCount() メソッドも追加します。
  • Main.java:貸し出しシステムが動作する様子を示します。5つの入力を受け取ります。本の ISBN、title、author、続いてユーザー ID と name です。

    これらの入力を使って Book と User を作成します。本の詳細と利用可能状況を出力します。次に、ユーザーに本を借りさせます。本の利用可能状況をもう一度出力し、その後、誰が借りたかを Borrowed by: [userId] の形式で出力します。ユーザーが所持している本の冊数を [name] has [count] book(s) の形式で出力します。最後に、ユーザーに本を返却させ、利用可能状況をもう一度出力します。

入力は次の順序で5つ受け取ります:ISBN (String)、title (String)、author (String)、user ID (String)、user name (String)。

たとえば、入力が 978-0-13-468599-1Effective JavaJoshua BlochU001Alice の場合、出力は次のようになります。

[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: true

このチャレンジは前回の取り組みを直接発展させたもので、本とユーザーの間に重要な関係を追加し、Library Management System を機能させます。コンポジション(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();
        
        // isbn、title、author で Book オブジェクトを作成する
        Book book = new Book(isbn, title, author);
        
        // userId と userName で User オブジェクトを作成する
        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());
    }
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ