You may assume that a Book has an author, title, ISBN number, and publication date with appropriate accesssors and an overridden method toString. ISBN numbers are unique.
Equals for books compares ISBN numbers. However, since books are created by the Library, will have unique ISBN numbers (make sure this is enforced) and are immutable, you don't have to worry about equals, since only identical books can have the same ISBN numbers.
A Library has a constructor that will initialize it with a collection of books. You can simply create a few predefined books in this constructor, rather than going to the effort of trying to read info from a data file, but you should at least have code available to make sure that duplicate ISBN numbers are not stored. Additionally, the Library provides two public methods:
Implement this spec using weak references (to reclaim books), along the lines of the Foo pool demonstrated in class. This means that Book is an interface, the behavior of books is implemented in BookImpl, and the checkout method actually returns a BookProxy. Both checking out a book and the reclamation of a book should be constant-time operations. Provide a test program that illustrates the behavior of your library class.