04 - La Forja: el inventario deja de tener techo
Los límites de la plantilla y de la forja son techos artificiales: cuando uno se agota, no hay forma de crecer. Además, consumir una poción del inventario de un héroe exige eliminar elementos mientras se recorre. El paso aplica el tema: List, Set, Map, iteración segura con Iterator e implementaciones hash y de árbol.
1. Qué se pide
- Plantilla y forja crecen sin techo: los límites desaparecen del diseño (y con ellos sus avisos de “gremio completo”).
- La forja ya no admite el mismo ítem dos veces: el
equals/hashCodedel paso 03, al fin, tiene su consumador. - El consumo de pociones funciona: aplicar el efecto y eliminar la poción del inventario mientras se recorre no debe tumbar el programa.
- El gremio ofrece informes por agrupación: la plantilla organizada por clase de juego, con el tamaño de cada grupo.
- Existe un ranking por poder de combate: el listado en orden es posible sin ordenar a mano cada vez — si el héroe tiene orden natural, la colección lo mantiene.
- Listar, buscar y las variantes del paso 02 siguen pasando todas sus pruebas.
2. Con qué
- Todo lo del tema: genéricos, la familia
Collection(Set,List),Mapcon sus dos recorridos (keySetfrente aentrySet), iteración segura (Iteratoro su equivalente),Comparable/Comparatory las utilidades dejava.util.Collections. - El criterio del tema manda: se declara por la interfaz y se instancia por la implementación. El cambio de implementación no debe tocar ni una línea del resto del programa.
- Ojo con las colecciones: guardan objetos, no primitivos — la plantilla ya lleva héroes desde el 03, pero cualquier contador que vaya a vivir dentro de una colección es un envoltorio.
3. Decisiones tuyas
- ¿Qué estructura resuelve cada requisito y por qué? El diseño del gremio tiene esa atmósfera: si eliges bien, cada línea del requisito justifica una estructura distinta. Justifica cada elección por lo que manda en ella: si el requisito es de orden, de unicidad o de acceso por clave.
- ¿Qué implementación concreta (hash, árbol, índice) elige cada interfaz? ¿Qué gana y qué cuesta frente a las otras?
- ¿El orden natural del héroe es su poder, o prefieres un comparador aparte para el ranking? ¿Y por quién se pregunta si dos héroes empatan?
- ¿Cómo recorre el informe por clase la plantilla: pregunta por clase a clase, o recorre la relación completa clave-valor a la vez?
- ¿Cómo queda el recuento de héroes si la propia colección lo lleva? Ahí el autoboxing trabaja solo — con un envoltorio por valor, que conviene saber leer.
4. Comprobación
- Registrar más héroes de los que cabían ayer no avisará de nada: la plantilla ya no sabe de techos.
- Intentar meter dos veces el mismo ítem en la forja altera el tamaño una vez, y solo una.
- Consumir una poción de un héroe con varias elimina la correcta sin tartamudear: ningún error de modificación concurrente.
- El listado por clases suma los tamaños de los grupos y es igual al total de la plantilla.
- El ranking se trae el héroe con mayor poder primero, y empatados en poder se resuelven según la decisión documentada.
- Las pruebas de los pasos anteriores no cambian línea a línea: solo cambia la estructura por debajo.
5. Pendientes
- El usuario introduce letras en el nivel y la aplicación tumba (
NumberFormatException); el punto de control de niveles sigue corrigiendo en silencio → excepciones propias (05). - Los límites del gremio que se quedan (cuántas plazas *máximas* se configuran…) viven escritos en el código → fichero de configuración (05).
- La agrupación por clase aún se escribe a mano → Stream (06).