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 creando el Sistema de Gestión de Bibliotecas mediante la creación de un sistema de préstamos adecuado con una clase Library que gestione la colección de libros y usuarios. Aquí es donde tu sistema empieza a parecerse a una biblioteca real: ¡hacer un seguimiento de quién tiene qué y aplicar las reglas de préstamo!
Organizarás tu código en cuatro archivos:
Book.java: Conserva tu clase Book del desafío anterior con toda su funcionalidad: isbn, title, author, isAvailable, borrowedBy, getDetails() y los getters/setters correspondientes.User.java: Conserva tu clase User con id, name, la ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() y toString().Library.java: Crea la clase centralLibraryque gestione 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 entre los libros y devuelve el Book cuyo ISBN coincida, onullsi no lo encuentra.findUserById(String id)- busca entre los usuarios y devuelve el User cuyo ID coincida, onullsi no lo encuentra.borrowBook(String userId, String isbn)- busca al usuario y el libro; después, 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 el libro; después, 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: ¡Integra tu sistema de biblioteca! Recibirás los datos de dos libros (ISBN, título y autor de cada uno), un usuario (ID y nombre) y, después, una serie de operaciones.Crea una Library, añade ambos libros y registra al usuario. Después, procesa las operaciones: recibirás una cadena separada por comas en la que 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 con el formato
[isbn]: [Available/Borrowed].
Recibirás las entradas en este orden: ISBN de book1, título de book1, autor de book1, ISBN de book2, título de book2, autor de book2, ID de usuario, nombre de 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, el resultado sería:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedEste desafío reúne la composición, la encapsulación y el diseño de métodos para crear un sistema cohesionado. La clase Library actúa como coordinadora y delega la lógica real de los préstamos en 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 (separada por comas, formato: borrow:userId:isbn or 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 el 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 resumen para cada libro en 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 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