Clases de Libro y Usuario
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 78 de 87.
Desafío
FácilContinuemos construyendo el sistema de gestión de bibliotecas ampliando las clases Book y User de la lección anterior. Ahora añadirás la capacidad para que los usuarios tomen libros prestados, creando una conexión real entre estas dos entidades.
Organizarás tu código en tres archivos:
Book.java: Mejora tu clase Book del desafío anterior. Conserva toda la funcionalidad existente (isbn, title, author, isAvailable con getters/setters ygetDetails()). Ahora añade un campo privadoborrowedByde tipoStringque almacene el ID del usuario que tomó prestado el libro (onullsi no está prestado). Añade un getter paraborrowedByy un setter que también actualiceisAvailablesegún corresponda: cuando se presta un libro (borrowedBy se establece con un valor no nulo), deja de estar disponible; cuando se devuelve (se establece en null), vuelve a estar disponible.User.java: Amplía tu clase User para realizar un seguimiento de los libros prestados. Conserva el id, name, constructor, getters ytoString()existentes. Añade un campo privadoArrayList<Book>llamadoborrowedBooks(inicialízalo en el constructor). Crea un métodoborrowBook(Book book)que añada el libro a la lista del usuario y establezcaborrowedBydel libro con el ID de este usuario. Crea un métodoreturnBook(Book book)que elimine el libro de la lista y establezcaborrowedByen null. Añade un métodogetBorrowedCount()que devuelva cuántos libros tiene actualmente el usuario.Main.java: Demuestra el sistema de préstamos en acción. Recibirás cinco entradas: ISBN, título y autor de un libro; después, el ID y el nombre del usuario.Crea un Book y un User con estas entradas. Imprime los detalles y el estado de disponibilidad del libro. Después, haz que el usuario tome prestado el libro. Imprime nuevamente la disponibilidad del libro, seguida de quién lo tomó prestado, con el formato
Borrowed by: [userId]. Imprime cuántos libros tiene el usuario con el formato[name] has [count] book(s). Finalmente, haz que el usuario devuelva el libro e imprime la disponibilidad una vez más.
Recibirás cinco entradas en este orden: ISBN (String), título (String), autor (String), ID de usuario (String) y nombre de usuario (String).
Por ejemplo, con las entradas 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 y Alice, tu salida sería:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueEste desafío se basa directamente en tu trabajo anterior y añade la relación fundamental entre libros y usuarios que hace funcional a un sistema de biblioteca. Utilizarás composición (User «tiene» Books) y verás cómo los cambios en un objeto pueden afectar a otro mediante métodos bien diseñados.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer información del libro
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Leer información del usuario
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Crear un objeto Book con isbn, title y author
Book book = new Book(isbn, title, author);
// Crear un objeto User con userId y userName
User user = new User(userId, userName);
// Imprimir los detalles del libro usando getDetails()
System.out.println(book.getDetails());
// Print whether the book is available (format: "Available: true" or "Available: false")
System.out.println("Available: " + book.isAvailable());
// Hacer que el usuario tome prestado el libro
user.borrowBook(book);
// Imprimir la disponibilidad del libro de nuevo
System.out.println("Available: " + book.isAvailable());
// Imprimir quién lo tomó prestado
System.out.println("Borrowed by: " + book.getBorrowedBy());
// Imprimir cuántos libros tiene el usuario
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Hacer que el usuario devuelva el libro
user.returnBook(book);
// Imprimir la disponibilidad una vez más
System.out.println("Available: " + book.isAvailable());
}
}Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado10Manejo de excepciones en POO
Jerarquía de clases de excepcionesExcepciones personalizadasErrores Checked vs UncheckedPatrón Try With ResourcesResumen - Usuario validado13Proyecto: Gestión de biblioteca
Descripción general del proyecto y diseño UMLClases de Libro y UsuarioSistema de préstamosFuncionalidad de búsquedaInterfaz de administradorIntegración de manejo de excepcionesPruebas e integración2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online