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 Biblioteca expandiendo las clases Book y User de la lección anterior. Ahora agregarás la capacidad para que los usuarios tomen prestados libros, 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. Mantén toda la funcionalidad existente (isbn, title, author, isAvailable con getters/setters, ygetDetails()). Ahora agrega un campo privadoborrowedByde tipoStringque almacene el ID del usuario que tomó prestado el libro (onullsi no ha sido prestado). Agrega un getter paraborrowedByy un setter que también actualiceisAvailableen consecuencia: cuando se presta un libro (borrowedBy se establece en un valor no nulo), este deja de estar disponible; cuando se devuelve (se establece en null), vuelve a estar disponible.User.java: Expande tu clase User para rastrear los libros prestados. Mantén los campos id, name, el constructor, los getters ytoString()existentes. Agrega un campo privadoArrayList<Book>llamadoborrowedBooks(inicialízalo en el constructor). Crea un métodoborrowBook(Book book)que agregue el libro a la lista del usuario y establezca elborrowedBydel libro con el ID de este usuario. Crea un métodoreturnBook(Book book)que elimine el libro de la lista y establezcaborrowedByen null. Agrega un métodogetBorrowedCount()que devuelva cuántos libros tiene el usuario actualmente.Main.java: Demuestra el sistema de préstamos en acción. Recibirás cinco entradas: ISBN, título, autor de un libro, luego el ID y el nombre del usuario.Crea un Book y un User con estas entradas. Imprime los detalles del libro y su estado de disponibilidad. Luego, haz que el usuario tome prestado el libro. Imprime la disponibilidad del libro nuevamente, seguido de quién lo tomó prestado en el formato
Borrowed by: [userId]. Imprime cuántos libros tiene el usuario en 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 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, agregando la relación crucial entre libros y usuarios que hace que un sistema de biblioteca sea funcional. ¡Usarás composición (User "tiene" Books) y verás cómo los cambios en un objeto pueden afectar a otro a través de 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 la información del libro
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Leer la información del usuario
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Crear un objeto Book con isbn, título y autor
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());
// Imprimir si el libro está disponible (formato: "Available: true" o "Available: false")
System.out.println("Available: " + book.isAvailable());
// Hacer que el usuario pida prestado el libro
user.borrowBook(book);
// Imprimir la disponibilidad del libro nuevamente
System.out.println("Available: " + book.isAvailable());
// Imprimir quién lo pidió 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 Usuario2Modificadores 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 Iterator