Sistema de préstamos
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 79 de 87.
Desafío
FácilContinuemos construyendo el Sistema de Gestión de Biblioteca creando un sistema de préstamo adecuado con una clase Library que gestione la colección de libros y usuarios. Aquí es donde tu sistema empieza a sentirse como una biblioteca real: ¡rastreando quién tiene qué y aplicando reglas de préstamo!
Organizarás tu código en cuatro archivos:
Book.java: Mantén tu clase Book del desafío anterior con toda su funcionalidad: isbn, title, author, isAvailable, borrowedBy, getDetails() y los getters/setters apropiados.User.java: Mantén tu clase User con id, name, el ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() y toString().Library.java: Crea la clase centralLibraryque gestiona todo. Tu biblioteca debe mantener dos ArrayLists: uno para objetosBooky otro para objetosUser. Incluye estos métodos:addBook(Book book)- añade un libro a la colección de la biblioteca.registerUser(User user)- añade un usuario a los usuarios registrados de la biblioteca.findBookByIsbn(String isbn)- busca a través de los libros y devuelve el Book con el ISBN coincidente, onullsi no se encuentra.findUserById(String id)- busca a través de los usuarios y devuelve el User con el ID coincidente, onullsi no se encuentra.borrowBook(String userId, String isbn)- busca al usuario y al libro, luego, si ambos existen y el libro está disponible, hace que el usuario tome prestado el libro e imprime[userName] borrowed [bookTitle]. Si el libro no está disponible, imprimeBook not available. Si no se encuentra el usuario o el libro, imprimeInvalid user or book.returnBook(String userId, String isbn)- busca al usuario y al libro, luego hace que el usuario devuelva el libro e imprime[userName] returned [bookTitle]. Si no se encuentra el usuario o el libro, imprimeInvalid user or book.Main.java: ¡Une todo tu sistema de biblioteca! Recibirás entradas para dos libros (ISBN, título, autor cada uno), un usuario (ID, nombre) y luego una serie de operaciones.Crea una Library, añade ambos libros y registra al usuario. Luego procesa las operaciones: recibirás una cadena separada por comas donde cada operación tiene el formato
borrow:userId:isbnoreturn:userId:isbn.Después de procesar todas las operaciones, imprime un resumen que muestre el estado de cada libro en el formato
[isbn]: [Available/Borrowed].
Recibirás las entradas en este orden: ISBN del libro1, título del libro1, autor del libro1, ISBN del libro2, título del libro2, autor del libro2, ID del usuario, nombre del usuario y, finalmente, la cadena de operaciones.
Por ejemplo, con las entradas ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice, y borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, tu salida sería:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedEste desafío reúne composición, encapsulamiento y diseño de métodos para crear un sistema cohesivo. ¡La clase Library actúa como un coordinador, delegando la lógica de préstamo real a las clases User y Book mientras gestiona la colección general!
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 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Leer información del libro 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Leer información del usuario
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Leer cadena de operaciones (separadas por comas, formato: borrow:userId:isbn o return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Crear objetos Book para book1 y book2
// TODO: Crear un objeto User
// TODO: Crear una Library, añadir ambos libros y registrar al usuario
// TODO: Dividir operationsStr por "," y procesar cada operación
// Para cada operación, dividir por ":" para obtener action, userId, isbn
// Llamar a library.borrowBook() o library.returnBook() según corresponda
// TODO: Imprimir el resumen de cada libro en el formato "[isbn]: [Available/Borrowed]"
}
}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