20251028 JAXB_4 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Tendríamos dos opciones, la A y la B, y seguro
00:00:00
que la A nos gusta y la B sí.
00:00:01
La A, pues sería
00:00:04
desde el XML hacer el esquema
00:00:06
a mano, que sabéis
00:00:07
porque habéis estudiado
00:00:10
esquemas el año pasado y sabéis hacerlo,
00:00:11
pues es el Complex Diver y poniendo la
00:00:13
Sequence, si es una lista, el Unbounded
00:00:15
Unlimited, el todo,
00:00:17
el Unbounded no sé qué, sabéis
00:00:19
hacer un esquema.
00:00:21
Vale, pero bueno, no podemos
00:00:23
repasarlo todo, entonces
00:00:25
pues seguramente preferir la opción B
00:00:27
Que generarlo
00:00:29
Automáticamente a alguna herramienta online
00:00:30
¿Verdad? Lo sabía
00:00:33
Vale, entonces, por curiosidad
00:00:34
¿Qué herramientas online usáis vosotros
00:00:37
Para generar? Porque yo, el otro día
00:00:39
Cuando lo generé, puse la primera
00:00:41
Que me salió en Google, porque yo no trabajo
00:00:43
Con NXML normalmente
00:00:45
Y sí, me salió el esquema, pero
00:00:46
Me salió un poco feo
00:00:49
¿Qué herramientas usáis vosotros para
00:00:51
De hecho
00:00:55
Más que feo, me salió mal
00:00:57
lo tuve que cambiar porque no había
00:00:58
generar xml
00:01:00
xsd
00:01:01
desde xml
00:01:04
¿El año pasado
00:01:06
usabais alguna herramienta en concreto?
00:01:08
Yo usé alguna, pero no me acuerdo
00:01:11
Yo he probado varias
00:01:12
Pero en clase, ¿en ningún momento generasteis
00:01:14
esquemas con las herramientas online?
00:01:16
No, de hecho es que nos mandó un porro
00:01:18
donde tal vez dijo, bueno, hacerlas
00:01:20
Como no había tiempo, nos mandó
00:01:22
Vale, pues bueno
00:01:24
Uno puede usar una herramienta cualquiera de estas
00:01:28
O como yo ya lo generé el otro día
00:01:31
Pues coger el mío y ya está
00:01:34
¿Qué era?
00:01:36
Si hubierais dicho el de recetario
00:01:38
Eso no lo tenía
00:01:39
Pero bueno, lo hubiéramos generado y ya está
00:01:40
¿Qué? ¿Dónde lo tengo?
00:01:41
Mezco tonta
00:01:47
Ah, estoy en el de abajo
00:01:48
Vale
00:01:53
Ah, esquemas, lo tengo aquí
00:01:55
Vale
00:02:01
Tengo que hacerlo en inglés
00:02:02
Vale, pues voy a subirlo
00:02:06
Bueno, a ver, voy al botón derecho
00:02:08
Guardar enlace como, ¿vale?
00:02:10
Muy bien
00:02:13
Y
00:02:14
Y ponerlo donde queráis
00:02:16
Pues en la carpeta
00:02:21
SRC Main Resources
00:02:23
Si queréis, os abrís una
00:02:24
Que sea esquemas
00:02:26
Y lo guardáis en esquemas, donde queráis
00:02:27
¿Vale? Entonces
00:02:30
Yo me lo voy a abrir en una carpeta
00:02:31
Y ahí me lo pongo
00:02:35
ahí no está
00:02:44
está nuestro esquemita
00:03:01
entonces efectivamente
00:03:04
es un poco feo
00:03:06
porque no lo ha hecho
00:03:09
generando los tipos aparte
00:03:10
al no haber generado los tipos aparte
00:03:11
al no haber hecho un tile
00:03:14
y luego haber hecho referencia al tile
00:03:16
pues le queda un nivel de anidamiento horroroso
00:03:18
claro
00:03:20
pero bueno
00:03:21
pero lo entendemos
00:03:22
lo entendéis que es lo que importa
00:03:26
universidad es una lista
00:03:27
de facultades
00:03:30
facultades a su vez es una lista
00:03:31
de facultad
00:03:33
de hecho
00:03:39
de hecho
00:03:41
no está bien este esquema
00:03:46
porque
00:03:49
como el xml que le pasé
00:03:49
para generarlo solo tenía
00:03:52
ah no no perdón perdón
00:03:54
perdón facultades es el nodo envolvente
00:03:56
que es solo uno perdón perdón está bien
00:03:58
que tienen varias
00:04:00
Tiene un montón de facultades, por eso facultades es unbounded este. Y ahora ya tiene el envolvente carreras, que tiene un montón de carreras. Y luego ya cada carrera tiene nombre, departamento y estudiantes, que es el envolvente de estudiante, que puede tener muchos cada carrera.
00:04:01
y cada estudiante tiene su nombre, su edad y su email
00:04:20
y un envolvente de materias que puede contener muchas materias.
00:04:29
Cada materia con su nombre, nota y código.
00:04:35
Algunos de ellos son atributos además.
00:04:39
Bueno, pues esto sí, lo podríamos haber hecho.
00:04:42
Este es el atributo del estudiante, creo.
00:04:45
No sé, ya he perdido la...
00:04:47
y podríamos haberlo hecho a mano
00:04:49
lógicamente, pero bueno, se hace un poquito
00:04:52
pesado hacerlo a mano
00:04:54
entonces
00:04:56
lo único
00:04:57
cuidado con las herramientas que lo generan online
00:05:00
porque
00:05:02
si
00:05:03
a mí claro, como el XML que le pasé
00:05:05
creo que solo tenía un estudiante
00:05:08
o solo tenía una facultad, no sé, entonces
00:05:10
él no interpretó que podía tener varias
00:05:12
entonces le tuve que añadir
00:05:14
el
00:05:16
el maxocus este para que
00:05:17
incorporara que podía tener más de una
00:05:19
pero bueno, salvo por ese detalle
00:05:21
lo normal es que lo genere bien
00:05:23
vale, pues si tenemos el esquema
00:05:25
ahora ya la herramienta
00:05:28
esta xjc
00:05:30
bueno, pues la herramienta
00:05:31
xjc
00:05:42
que es otro conjunto de clases
00:05:43
es la que nos permite
00:05:45
a través de un
00:05:47
a partir de un XSD generar las clases
00:05:49
JaxB
00:05:51
entonces el otro día ya dijimos que podíamos
00:05:52
invocarla desde consola
00:05:55
pues XJC
00:05:57
claro, habría que ponerse en la ruta
00:05:59
donde está el bin de XJC
00:06:01
que no está dentro del JDK
00:06:03
porque desde Java 11
00:06:05
la tecnología
00:06:07
de JaxB ha salido de la máquina
00:06:11
virtual, entonces
00:06:13
XJC tendría que descargarlo como
00:06:14
un JAR o como dependencia como haremos nosotros
00:06:17
y si yo ya lo añado al pad
00:06:19
pues entonces puedo invocar al comando
00:06:21
claro, si he añadido al pad
00:06:23
ese hard y lo invoco
00:06:25
le doy el XSD
00:06:27
y me genera las clases y ya está
00:06:29
pero si estamos trabajando con el Eclipse
00:06:31
pues hombre
00:06:34
podemos usar el plugin que me da Eclipse
00:06:35
y ese plugin
00:06:37
¿cómo lo invocamos?
00:06:39
pues nos ponemos en el
00:06:41
ah, perdón
00:06:43
nos ponemos en el botón
00:06:45
derecho del esquema
00:06:47
y en algún momento nos sale
00:06:49
el generar
00:06:53
y aquí yo puedo generar las clases
00:06:55
yaxb o un xml file de ejemplo
00:06:59
si quiero
00:07:01
genero las clases yaxb
00:07:02
y el ya
00:07:04
vale
00:07:06
lo quiero aquí
00:07:08
pues las quiero aquí
00:07:10
y esto lo dejamos todo por defecto
00:07:13
defecto. Podríamos empezar a entrar a ver qué significa cada una. Tendríamos dos problemas.
00:07:20
Uno, que la mayoría de las cosas no lo sé. Dos, que perderíamos mucho tiempo. Entonces,
00:07:26
en la operativa nuestra de trabajo, pues si no funciona con las opciones por defecto,
00:07:31
así nos quedamos y ya está. Vale. Puede que sobre escribas las clases que ya tenías.
00:07:35
¿No te importa? No, hombre, no me importa. Y ¡pum! Claro, normal. ¿Vale? ¿Qué es
00:07:48
lo que me está diciendo? Rápido.
00:07:56
Ya, pero ¿qué es lo del
00:07:59
XJC? ¿Qué me está diciendo? Traducidmelo a mi
00:08:00
idioma.
00:08:02
Ya, pero ¿qué me está diciendo?
00:08:04
¿Qué hay que importar?
00:08:06
¿Qué me está diciendo?
00:08:09
¿Que le falta la dependencia?
00:08:10
Pues eso, ¿vale? No es que haya que importar.
00:08:12
Tú importas cuando ya tienes la dependencia integrada
00:08:14
en tu proyecto. Eso es lo que me está diciendo.
00:08:16
¿Vale?
00:08:18
Entonces, en cuanto
00:08:19
al class not found exception,
00:08:20
ahora ya en nuestro idioma es
00:08:23
Al POM le faltan cosas
00:08:24
Al POM le faltan cosas
00:08:27
Traducido a nuestro idioma
00:08:28
Pues sí, es que nuestro POM efectivamente
00:08:30
Le hemos dejado aquí
00:08:32
Más solo
00:08:34
Que es que no tiene ahí nada de nada
00:08:35
No le hemos quitado ni el rojito
00:08:39
Que eso ya sí que
00:08:41
Ah, no era ese
00:08:43
Me he equivocado de ese
00:08:47
Era este
00:08:48
No le hemos quitado ni el rojo
00:08:50
Vale
00:08:55
¿Cómo que ni te sale?
00:08:55
¿No te sale el rojo?
00:09:00
¿Sin la S puesta?
00:09:02
Pues no lo sé
00:09:11
Alguna combinación extraña de versiones
00:09:12
Que tienes en tu arquitectura
00:09:15
Vale, entonces
00:09:16
La dependencia de JaxB lógicamente nos falta
00:09:20
Porque vamos a trabajar con las anotaciones
00:09:23
Las clases generadas
00:09:25
Van a tener las anotaciones
00:09:26
Si no está en la dependencia de JaxB
00:09:28
Esas anotaciones no van a
00:09:31
Poder ser resueltas
00:09:33
Bueno, pero es que eso ya lo sabemos de memoria
00:09:35
Y eso lo copiamos de
00:09:38
Otro proyecto
00:09:39
Claro que lo tenéis en el otro Eclipse
00:09:40
Eso
00:09:42
Eran la API
00:09:46
Que era esta de aquí
00:09:50
La API que era esta y luego la
00:09:51
Runtime que era la implementada
00:09:58
¿Eh?
00:10:00
Te coge todos los proyectos
00:10:01
O sea que no hay problema
00:10:03
Ah, bueno, sí, sí
00:10:04
Pero lo tienes que abrir
00:10:06
Ah, que estás usando el mismo workspace, te refieres
00:10:07
Sí
00:10:10
Y
00:10:11
Y la otra
00:10:17
Que es
00:10:19
La
00:10:21
Implementación
00:10:23
Vale
00:10:24
Esta por lo menos nos falta
00:10:26
Pero si uno
00:10:34
Si volvemos a intentar
00:10:41
Generarlo
00:10:43
Pongo cualquier cosa
00:10:44
Porque nos va a salir error, da lo mismo
00:10:53
No, no, no, perdona
00:10:54
He debido irme al proyecto que no es
00:11:05
Efectivamente
00:11:08
Vale
00:11:10
Lo que sea
00:11:15
Me da igual
00:11:23
Vale, nos sigue diciendo lo mismo
00:11:24
Claro, entonces
00:11:33
Ah, es que x, j, c
00:11:35
No me he acordado
00:11:37
No me he dado cuenta
00:11:39
de que, espérate, es una tecnología
00:11:40
diferente, vale
00:11:43
son situaciones típicas que nos pasan
00:11:44
es que es otra tecnología, aunque tenga que ver con JaxB
00:11:46
entonces va a ser que está en otro lado
00:11:48
va a ser que está en otro lado
00:11:51
bueno, pues uno se pone a buscar
00:11:52
si está completamente perdido
00:11:55
pues claro, tiene que buscar en el repositorio
00:11:57
de Maven, pero lo
00:11:59
claro, pero lo normal es que
00:12:00
tú partas ya de un proyecto base
00:12:02
y lo puedas copiar
00:12:04
vamos a, antes de ponerla
00:12:06
A ver si el repositorio de Maven
00:12:08
Nos
00:12:16
Vale, pues aquí buscaríamos
00:12:17
Por lo que sabemos
00:12:25
Que es XJC, es lo único que
00:12:27
XJC
00:12:30
Nosotros nos vamos siempre a lo moderno
00:12:33
Pues vámonos a esta, ¿no?
00:12:35
Venga
00:12:38
Vamos a esta
00:12:39
Septiembre del 2025
00:12:44
Ahí nos vamos
00:12:48
copiamos
00:12:50
y otra vez
00:12:52
aquí
00:12:57
vale
00:12:57
entonces después de grabar
00:13:06
tendremos aquí
00:13:10
la dependencia de maven
00:13:12
en las dependencias de maven
00:13:14
ya se nos ha metido ahí la leche
00:13:16
entre ellas
00:13:18
de xbx, jc, esta de aquí
00:13:21
y algunas de las que tira
00:13:22
vale
00:13:24
es que plantearse hacer cualquier cosita
00:13:25
Ya sin Maven es una locura
00:13:28
Porque Maven ya sabe
00:13:29
Que cuando tú buscas una dependencia
00:13:31
Esa va a depender de muchas otras
00:13:34
Y te las descarga también
00:13:36
Si no tendrías que hacer tú el rastreo
00:13:37
De hecho aquí pues
00:13:43
Aquí las tenemos
00:13:45
Ahora ya sí
00:13:48
Me genera las clases
00:13:51
Voy a borrarlas
00:13:52
Porque
00:13:55
Ah por cierto yo no la he cambiado
00:13:56
Voy a cambiarla
00:14:07
Esto siempre se me olvida
00:14:10
La máquina virtual
00:14:13
Y el nivel de compilación
00:14:16
Es que tú tienes un problema
00:14:17
Con las rutas, con el classpath
00:14:20
Por eso es por lo que
00:14:22
Por eso digo
00:14:23
Que tú tienes un problema con el
00:14:26
Pero bueno, solo cambias con el classpath
00:14:27
Entonces por eso ese clip se no te reconoce nada
00:14:29
Pero ahora lo ponemos
00:14:32
Vale, entonces yo que iba a hacer
00:14:34
Cambiar el
00:14:36
el nivel este de compilación
00:14:37
al, en mi caso
00:14:41
es el 22, no es el vuestro
00:14:43
máquina última es la 22
00:14:45
vale, vamos a verificar que ahora salen
00:14:50
y si a alguno no le sale lo miramos
00:14:52
rápidamente y luego las
00:14:54
pues ahora ya si, generamos
00:14:55
las clases jacks b
00:14:58
en que paquete
00:15:00
pues en este, que es donde
00:15:04
va a estar el modelo de clases
00:15:09
todo esto
00:15:11
lo dejamos igual, bla bla bla
00:15:13
Vale, o sea, ha generado a todo el mundo
00:15:15
Dos miserillas clases en lugar de las tropecientas
00:15:25
Que hacíamos nosotros
00:15:28
Una por entidad
00:15:30
¿De dónde te la tienen que decir?
00:15:32
En el nombre de paquete que tú le hayas dicho
00:15:37
Que si no existe te lo crea
00:15:39
Vale
00:15:41
Y tú ahí, pues
00:15:43
Vamos a ver
00:15:45
No, no, pero espera
00:15:49
Bueno, a ver, lo que no tienes es incorporar
00:15:56
Las par
00:15:59
No, pero ayer el proyecto
00:15:59
Vamos a ver
00:16:02
Vamos a ver
00:16:14
Cómo le arreglamos el problema
00:16:17
A este muchacho
00:16:20
Vale, entonces lo puede hacer un poquito más legible
00:16:22
Porque están todas arriba juntitas
00:16:29
No tienes que ir buscando en cada get
00:16:30
¿Vale? Pero tienes que poner esto antes
00:16:32
Para que JaxB
00:16:35
Se entere de que tiene que ir aquí
00:16:36
No lo tiene que obtener desde el get
00:16:38
¿Vale? Esto ya sabemos lo que es
00:16:40
Esto ya sabemos lo que es
00:16:43
Y aquí ya
00:16:45
Lo empieza a anotar en anotaciones que conocemos
00:16:47
Pues esta es la
00:16:48
Facultades que es un elemento
00:16:49
Este es el atributo
00:16:52
De
00:16:55
De universidad
00:16:55
De la clase universidad
00:16:58
Y así todo
00:16:59
¿Qué es lo que cambia? Lo hace de tal manera que las genera como clases internas. Entonces, a ver, esto está bien en realidad si estas entidades las vas a usar solamente para la parte de acceso al fichero, porque lo tienes todo ahí compacto en una sola clase y ya está.
00:17:01
pero si forman parte de tu modelo
00:17:24
para el resto de la aplicación
00:17:26
que interacciona con otras cosas, pues hombre
00:17:27
las entidades de un modelo
00:17:30
están siempre por separado
00:17:31
¿vale?
00:17:34
entonces, puede
00:17:36
que en alguna de las cosas
00:17:38
que yo he dicho
00:17:40
aquí lo ponemos todo por defecto
00:17:41
seguramente, no estoy segura
00:17:44
podríais investigar si quisierais, tampoco
00:17:45
creo que con XML debáis perder mucho tiempo
00:17:47
porque bueno, los XML
00:17:50
ya ahora mismo llegan hasta donde llegan
00:17:52
seguramente cambiando alguna de esos
00:17:54
check, pues te las genera
00:17:57
como clases separadas
00:17:59
¿vale? pero yo he preferido
00:18:01
que las genere como internas
00:18:03
para que recordemos
00:18:05
brevemente en 5 minutos, por si alguien no lo tiene
00:18:07
fresco, lo de las clases internas
00:18:09
porque es
00:18:11
una forma de organizar las clases que se usa
00:18:12
a veces en ciertos contextos
00:18:15
y si alguien no lo tiene claro
00:18:17
pues conviene recordarlo
00:18:18
¿vale?
00:18:21
Entonces, la clase universidad tiene dos propiedades que están anotadas y una de las propiedades que es facultades es una clase interna de universidad que está aquí dentro, ¿veis?
00:18:22
esta clase está dentro
00:18:47
de la otra, está dentro
00:18:50
y una clase interna
00:18:52
puede ser estática
00:18:54
una clase interna es el único
00:18:56
caso de clase
00:18:58
que puede recibir un
00:19:00
modificador estático, porque en ese contexto
00:19:02
tiene sentido
00:19:04
¿recordáis mínimamente
00:19:04
lo de las clases internas, clases estáticas
00:19:08
o algo así?
00:19:10
no hace falta ni que repasemos nada
00:19:11
de las clases
00:19:13
internas porque eran como se usaban
00:19:16
y cuando son estáticas y cuando no
00:19:18
ah, creía que decías
00:19:20
sí, sí, lo recuerdo perfectamente
00:19:22
bueno, pues venga
00:19:23
vamos a recordarlo en 5 minutos
00:19:26
porque lo podemos encontrar en otros contextos
00:19:28
¿qué?
00:19:30
a ver
00:19:34
pues vamos a hacer un proyecto normal
00:19:35
este no hace falta que sea Moven, Maven, porque es para
00:19:38
jodida
00:19:40
Moven, no hace falta que sea, joe, aquí es que
00:19:42
hombre
00:19:44
Has triunfado
00:19:45
No hace falta, ahora lo
00:19:48
Vale
00:19:50
Lo que cuesta aquí
00:19:51
Encontrar un proyecto normal y corriente
00:19:54
Lo voy a tener que hacer en other
00:19:56
Y ya está, other
00:19:57
En java
00:19:59
Java
00:20:02
Un proyecto normal y corriente
00:20:04
Un proyecto java project normal
00:20:05
Para hacerlo de las clases internas
00:20:07
Para recordarlo
00:20:09
Vale
00:20:10
Recordatorio
00:20:15
Recordatorio
00:20:19
Clases internas
00:20:21
Vale, y con esto, interpretando un poquito
00:20:25
Luego esas clases
00:20:32
Y mencionando unas cuantas cosas más
00:20:33
Los XML los vamos a dar por
00:20:35
Ventilados
00:20:37
Vale, está en la perspectiva
00:20:39
De aplicaciones
00:20:46
Web, empresariales
00:20:48
Entonces me dice, ¿quieres que te hable la perspectiva normalita
00:20:50
Y corrientita de toda la vida?
00:20:52
Pues sí, esta perspectiva ya es la igualita del otro eclipse, es la perspectiva que se olvida de aplicaciones empresariales, me ha quitado el icono de explorador web, de hecho, y me ha quitado un montón de cosas.
00:20:54
Bueno, pues a ver
00:21:08
Vale, pues por ejemplo
00:21:11
Vamos a hacer una clase normal y corriente
00:21:21
Una clase que sea
00:21:23
La clase
00:21:25
Instituto, por ejemplo
00:21:26
Yo que sé
00:21:33
Vale, entonces
00:21:34
Esta clase
00:21:44
Pues puede tener sus propiedades
00:21:46
Como siempre
00:21:48
Y ahora podría tener una propiedad más
00:21:49
Que fuera
00:21:55
la secretaría, que a su vez
00:21:56
tiene, ¿verdad?
00:21:58
Podría tener una propiedad secretaría
00:22:02
con todos los
00:22:04
detalles de la secretaría, para lo cual
00:22:06
habría una clase aparte que fuera
00:22:08
clase secretaría, como siempre. Hemos diseñado,
00:22:10
¿verdad? Entonces, bueno, ese diseño
00:22:12
es relativamente habitual, es el que
00:22:14
estamos acostumbrados. Una clase por
00:22:16
entidad y ya está. Y luego
00:22:18
relaciones entre ellas, porque unas contienen
00:22:20
a otras. Diseño el que estamos acostumbrados.
00:22:22
Pero bueno,
00:22:25
ese diseño implica
00:22:25
que pueden existir secretarías
00:22:28
por el mundo sin que haya
00:22:31
institutos
00:22:32
en función de
00:22:33
cómo programe uno la aplicación
00:22:36
podría darse una situación
00:22:38
que a lo mejor no tiene mucho sentido
00:22:40
que es que existan objetos secretaría
00:22:42
a los que se le puedan pedir
00:22:45
funcionalidades
00:22:46
pero es una estupidez
00:22:47
que eso se dé porque no puede existir
00:22:51
una secretaría en medio de la calle si no está dentro
00:22:52
de un instituto, claro
00:22:54
entonces si queremos recoger eso
00:22:56
para que nuestra aplicación
00:22:59
de alguna manera se adapte
00:23:01
a esa situación y por tanto
00:23:03
programemos en consecuencia
00:23:05
y se nos faciliten ciertas cosas
00:23:06
vale, pues en lugar
00:23:08
de programarlo así como una referencia
00:23:10
a una clase aparte
00:23:13
podemos hacerlo
00:23:14
como clase interna
00:23:17
claro, pero tendría, y que significa
00:23:25
requerir un instituto, buscar
00:23:27
los objetos existentes
00:23:29
Claro, pero
00:23:31
¿Dónde sacas el instituto?
00:23:34
Se lo pasas al constructor por parámetros
00:23:39
El constructor de secretaría necesite
00:23:40
Obligatoriamente que le pases un instituto
00:23:42
Sí, bueno, puedes hacer muchas posibilidades
00:23:44
Efectivamente
00:23:52
Vale, entonces, pues nada, esto me da igual
00:23:53
Pues tendría su
00:23:56
Yo que sé
00:23:57
El director de la secretaría
00:24:01
Y cualquier chorrada y ya está
00:24:03
Bueno, no merece la pena
00:24:04
Ni Getter ni Setter ni nada
00:24:10
Porque para lo que vamos a repasar
00:24:11
Quito esto, no pongo Getter y Setter
00:24:12
Porque para lo que vamos a repasar
00:24:16
Vale, pues entonces
00:24:17
Esta es una clase interna, una clase que va dentro de otra
00:24:19
Luego dentro de una clase
00:24:22
Ahora ya hay cuatro cosas
00:24:23
Que puede haber
00:24:25
Propiedades
00:24:26
Métodos
00:24:28
bloque static y clases internas, ¿vale?
00:24:30
Esas son las cuatro cosas que puede haber.
00:24:35
Recordad que el bloque static es esto.
00:24:37
El bloque static es un bloque con static delante
00:24:42
donde aquí puede haber sentencias
00:24:48
que trabajen solo con propiedades estáticas, ¿vale?
00:24:52
Por ejemplo, a lo mejor aquí yo tengo una propiedad estática
00:24:56
que afecta a todos los institutos, que es la comunidad, comunidad autónoma.
00:24:59
Entonces, en mi aplicación, todos los institutos pertenecen a la misma comunidad.
00:25:11
Pero bueno, esta aplicación puede funcionar en diferentes comunidades autónomas,
00:25:20
con lo cual esto lo pongo como variable.
00:25:24
Pero claro, lo pongo como variable estática, porque todos van a pertenecer a la misma.
00:25:25
Aunque en función de donde se arranque la aplicación el contenido pueda ser distinto
00:25:30
Pero común para todos los institutos
00:25:35
Entonces en el bloque estático, pues aquí puede haber sentencias y cualquier cosa
00:25:38
Puede haber cualquier código que afecte a las variables estáticas
00:25:43
Entonces, ¿cuándo se ejecuta el bloque estático?
00:25:56
La primera vez que se hace referencia a esa clase
00:25:59
Bien para instanciar un objeto instituto
00:26:02
Bien para acceder a alguna de sus propiedades estáticas
00:26:04
En cuanto se haga referencia a esta clase por primera vez
00:26:08
Automáticamente aparecen las variables estáticas y se ejecuta esto
00:26:13
Bueno, esto era por completar
00:26:17
Ahora ya sabemos, después de dos años por fin
00:26:18
Las cuatro cosas que puede haber dentro de una clase
00:26:21
Vale, pero ahora la que nos interesa aquí es la clase interna
00:26:23
Entonces, diseñar la secretaría como clase interna
00:26:26
Nos permite ahora en nuestro main
00:26:31
Yo tengo ya mi aplicación
00:26:33
Y ahora pues me hago
00:26:36
Un instituto
00:26:41
Vale, al instituto le puedo poner
00:26:42
Su
00:26:55
Nombre, así directamente
00:26:56
Ver este acceso
00:26:59
Así ya hace daño
00:27:01
Al corazón
00:27:02
Ya no acostumbra uno a los getty eso
00:27:04
Ver un acceso así
00:27:06
Pero bueno, vamos a ahorrarnos tiempo
00:27:08
Instituto tenía nombre
00:27:10
¿No? Porque me dice
00:27:13
instituto.nombre
00:27:14
pues igual a lo que sea
00:27:19
vale, y ahora yo voy a instanciar
00:27:20
una secretaría, efectivamente la secretaría
00:27:27
no la puedo instanciar por libre
00:27:29
no puedo hacer esto
00:27:31
con el
00:27:32
otro modelo de diseño que la clase
00:27:37
secretaría forma parte del modelo
00:27:40
como entidad aparte, yo podría
00:27:41
hacer esto
00:27:43
entonces, esto a lo mejor podría
00:27:44
generar en una aplicación muy
00:27:48
gordota que se va ampliando, poniendo
00:27:50
parches y parches, el hecho
00:27:52
de que esto se pueda hacer
00:27:54
podría generar un efecto secundario
00:27:55
indeseado, ¿vale?
00:27:58
Entonces en nuestras aplicaciones queremos que tengan
00:27:59
los mínimos efectos secundarios indeseados
00:28:01
entonces que exista una secretaría ahí suelta
00:28:03
a lo mejor genera un
00:28:05
funcionamiento incoherente
00:28:07
de la aplicación, pues si yo
00:28:09
la he
00:28:11
declarado así como clase interna
00:28:13
en lugar de como propiedad y clase aparte
00:28:17
solamente puedo instanciar una secretaría asociada a un instituto, ¿vale?
00:28:19
Solamente asociada a un instituto.
00:28:29
Tengo que tener un objeto instituto ya creado
00:28:32
y una vez que tengo un objeto instituto ya creado puedo instanciar una secretaría.
00:28:36
Y este objeto automáticamente, aparte de existir, está vinculado a este instituto.
00:28:41
Lo que pasa es que el nombre de la clase
00:28:45
Perdón, perdón
00:28:48
No quiero que lo haga con in porque no se ve bien
00:28:52
El nombre de la clase interna
00:28:54
Cambia, el nombre de la clase interna
00:28:56
Ahora es compuesto
00:28:58
¿Vale? Una clase interna
00:28:58
Su nombre es el suyo
00:29:02
Más el de la
00:29:04
Superclase, no, porque no hereda de ella
00:29:05
Más el de la clase que lo contiene
00:29:08
Y secretaría podría tener otra clase interna
00:29:09
secretaría podría tener aquí otra clase
00:29:19
dentro de la secretaría podría tener
00:29:21
una clase directores
00:29:23
yo lo he hecho aquí como string, pero podría haber
00:29:25
quitado eso y haber hecho una clase interna director
00:29:27
para que no pueda haber directores sueltos
00:29:29
tengan que existir una secretaría
00:29:30
dentro de un instituto, o sea eso
00:29:33
las clases internas se pueden anidar hasta el infinito
00:29:34
pero como de costumbre no queremos
00:29:37
hacer aplicaciones para liar
00:29:39
o para lucirnos, sino
00:29:40
para que sean lo más entendibles posibles
00:29:43
vale, pues entonces
00:29:45
en cuanto a las clases internas normales y corrientes
00:29:47
no estáticas, ya está
00:29:49
no hay más que saber
00:29:51
uno las puede usar
00:29:52
en las situaciones en las que quiera
00:29:54
evitar que proliferen objetos
00:29:56
que no tienen sentido que existan
00:29:59
si no está el que los contiene
00:30:03
entonces
00:30:05
aquí
00:30:06
esto tiene sentido
00:30:08
tiene sentido
00:30:11
porque no tiene sentido que existan universidades
00:30:13
perdón, que existan facultades
00:30:15
si no existe una universidad
00:30:18
y solamente tiene sentido que existan
00:30:19
carreras si existe una facultad
00:30:21
y solo hay estudiantes y existe una carrera
00:30:23
entonces aquí tiene todo el sentido del mundo
00:30:25
por eso por defecto se hace como clases
00:30:27
internas
00:30:29
vale, pero
00:30:30
y el modificador
00:30:32
static delante
00:30:35
¿qué significa?
00:30:37
vale, pues la clase
00:30:40
una clase puede ser estática
00:30:41
una clase interna
00:30:42
puede ser estática, por ejemplo, yo me puedo hacer aquí una clase interna estática
00:30:44
y esta clase interna estática, ahora no se me ocurre un concepto,
00:30:52
¿para qué me sirve esta clase?
00:31:03
Esta clase interna, si yo le pongo el modificador static,
00:31:09
es una clase a través de la cual puedo yo acceder solamente al contexto estático de la clase de arriba.
00:31:12
Es decir, solamente puedo acceder al contexto estático de instituto.
00:31:23
Entonces, esta clase es como si mi clase instituto tuviera una propiedad estática,
00:31:28
pero una propiedad estática que además puede hacer cosas.
00:31:37
¿Vale? Puede hacer, por ejemplo, esta es una propiedad estática, sin más, ¿verdad?
00:31:42
Una propiedad estática que es de clase stream.
00:31:49
Y comunidad, pues sí, puede llamar a los métodos de stream.
00:31:51
¿Vale? Entonces, yo podría haber hecho aquí, por ejemplo, cosas de la comunidad, cosas específicas de la comunidad.
00:31:55
Entonces, automáticamente
00:32:09
se crea, cuando aparezca un instituto
00:32:15
la primera vez que a un instituto se hace referencia
00:32:19
como se crea todo su contexto estático
00:32:23
se va a crear esto y se va a ejecutar el bloque estático
00:32:25
también se van a crear instancias
00:32:28
de sus clases internas estáticas
00:32:31
también se van a crear instancias de esto
00:32:33
igual que se ha creado instancia de esto
00:32:35
se van a crear instancias de esto
00:32:38
Y aquí dentro yo puedo hacer cualquier cosa
00:32:39
Pues cualquier método
00:32:45
Que use las variables estáticas de la clase
00:32:48
Por ejemplo, cambia comunidad
00:32:52
Y le paso aquí un string con la nueva comunidad
00:32:59
Y aquí yo puedo acceder a la variable estática
00:33:04
Comunidad
00:33:13
Igual a nueva
00:33:14
Comunidad
00:33:19
¿Vale?
00:33:21
Entonces a través de esta clase
00:33:24
Estática interna
00:33:26
Puedo acceder al contexto estático de arriba
00:33:27
Entonces recojo dentro de la clase
00:33:29
Recojo dentro de la clase
00:33:34
Muchas cosas
00:33:36
Sin necesidad de ponerlo como clases aparte
00:33:36
Esta es la idea
00:33:40
De las clases internas
00:33:42
Sobre todo la idea es que
00:33:43
Bueno, que no os olvidéis de que están, por si veis diseños hechos así, ¿vale?
00:33:45
Y ya sabemos que pueden ser no estáticas, con lo cual hay que instanciarlas específicamente,
00:33:52
hay que instanciarlas específicamente asociadas a un objeto que tiene que existir, como hemos hecho aquí,
00:34:00
y pueden ser estáticas, ¿vale?
00:34:05
Si son estáticas, no hay que instanciarlas específicamente,
00:34:09
Por ejemplo, aquí vamos a cambiar la comunidad
00:34:14
Aquí sería instituto.cosasdelacomunidad
00:34:20
Instituto, el nombre de la clase sigue siendo este, cosasdelacomunidad
00:34:27
¿Vale? Entonces, aquí
00:34:34
Este no necesita que exista un instituto
00:34:39
Esta la instancio a sí misma por libre
00:34:50
No necesita que exista
00:34:52
Esta la instancio así
00:34:54
¿Vale? El instituto podría no existir
00:34:56
Podría no existir
00:35:01
El instituto
00:35:03
Podría yo no haber creado ningún instituto
00:35:04
Sin embargo
00:35:10
Esto puede existir
00:35:12
Esto puede existir
00:35:14
Y yo puedo pues cambiar la comunidad
00:35:17
Sin necesidad de que exista ningún instituto
00:35:20
¿Vale?
00:35:22
¿Vale?
00:35:31
Claro, porque todos los institutos, efectivamente, claro, todos los institutos comparten todo lo estático.
00:35:33
Esta propiedad y esta también.
00:35:56
Vamos a instituto.comunidad Valencia, ¿vale?
00:36:00
Entonces, las clases estáticas es una manera de recoger dentro de la clase cosas que tú puedes querer hacer con el contexto estático, con las variables estáticas y ya está, ¿vale? En lugar de hacer una clase aparte que recoja todo eso o hacerlo como métodos aquí dentro, lo podrías hacer como métodos aquí dentro, ¿no? Cambiar comunidad, pero claro, entonces a lo mejor el cambiar comunidad, hacerlo como método estático dentro del instituto podría ser un diseño feo,
00:36:36
Porque en realidad no es el instituto el que cambia la comunidad, o sea, son todos en global. Entonces, pues bueno, es una cuestión de diseño simplemente, no es que haya que hacer las cosas así. Entonces, meto yo dentro de una clase estática todo aquello que se refiere a tocar el contexto estático y parece como que está más recogido, más aparte y no está como métodos a la misma altura de los métodos propios de instituto.
00:37:07
Los métodos propios de instituto deberían ser los que hacen cosas con el instituto, ¿vale? Y los métodos que hacen cosas con el contexto estático los puedo poner también ahí, por supuesto, dentro de la clase instituto que hemos hecho hasta ahora, o los puedo recoger dentro de una clase estática. Bueno, diferentes posibilidades de diseño, sin más.
00:37:30
vale, pues
00:37:48
ahora ya
00:37:50
que tenemos lo de las clases internas
00:37:52
recordado, porque no hay más historia que esto
00:37:54
pues bueno
00:37:56
ya entendemos esto un poco más
00:37:57
entonces, ¿por qué las ha puesto
00:37:59
estáticas? porque es que
00:38:01
ninguna de estas clases internas
00:38:04
accede, necesita usar
00:38:05
ninguna de las propiedades de aquí
00:38:07
es decir
00:38:09
JAXB
00:38:11
te crea una única universidad
00:38:13
¿vale?
00:38:16
Te crea una única universidad.
00:38:18
No hay muchas universidades.
00:38:20
Entonces, todo se trabaja como estático.
00:38:22
¿Vale?
00:38:25
Entonces, la clase facultades.
00:38:25
La clase facultades, ¿dónde está declarada?
00:38:28
Aquí.
00:38:32
Está como estática.
00:38:33
¿Por qué?
00:38:34
Porque no accede a ninguna propiedad de universidad.
00:38:35
No la usa para nada.
00:38:38
Ninguna propiedad de universidad.
00:38:40
Entonces, vamos a quitarle todo esto para que se vea más claro.
00:38:41
Hombre, son comentarios
00:38:45
Que te explican solamente
00:38:47
Cómo es el XML
00:38:49
O sea, que mete ahí una
00:38:51
Es que hay tanta clase interna
00:38:53
Que en este ejemplito
00:39:34
Pues cuesta verlo
00:39:38
Porque es que es mucha clase interna
00:39:39
Teníamos que haberlo hecho en un XSD más sencillo
00:39:40
Para
00:39:44
Para verlo mejor
00:39:45
Porque aquí tenemos una cantidad de anidamiento
00:39:47
Brutal
00:39:49
Claro, hay un montón
00:39:51
De clases internas, claro
00:39:53
Entonces, si uno genera las clases con esto
00:39:55
Pues vale, ya las tiene y funcionan
00:39:58
Pero es que luego para construirlas
00:39:59
Tiene que acordarse de que
00:40:02
Cada vez que instancia
00:40:03
Uno de los objetos de la universidad
00:40:04
Pues los tiene que instanciar
00:40:08
Con su nombre de clase interna
00:40:09
Pero ya está
00:40:11
No pasa nada
00:40:12
Vamos a ver si podemos hacerlo rápidamente
00:40:14
Sin volvernos locos
00:40:19
Claro, entonces
00:40:20
Vamos a hacer aquí un main
00:40:23
Vamos a hacer aquí un main
00:40:26
Y vamos a hacer un poco de
00:40:37
Gimnasia
00:40:39
A ver, nuestro xml
00:40:41
Que nos va a ser más fácil verlo desde el
00:40:44
xml
00:40:46
Voy a generar
00:40:48
Desde mi esquema
00:40:51
Un xml de ejemplo
00:40:53
Para
00:40:54
Sí
00:40:56
Porque así vamos a ver más claro
00:41:01
Venga
00:41:03
Venga, pues esto es un xml
00:41:05
de ejemplo cualquiera, entonces lo más interno es, vamos a crear
00:41:20
una materia cualquiera, pero claro, materia
00:41:23
está dentro de materias, es que ni siquiera
00:41:28
lo hace con envolvente, o sea, es que lo ha hecho la clase materias, que a su vez
00:41:32
tiene dentro materia, entonces vamos a crear, mi main está
00:41:36
aquí, no, este no era, mi main está
00:41:43
aquí
00:41:48
Vale, pues la clase materia está
00:41:49
Dentro de universidad
00:42:02
Que a su vez está en facultades
00:42:05
Que facultades es una clase que solo sirve para tener una lista de facultad
00:42:09
Es que ni hace envolvente ni hace nada además
00:42:13
Facultad tiene carreras
00:42:16
Carreras tiene carrera
00:42:18
Carrera tiene estudiantes
00:42:20
y estudiantes tiene estudiante
00:42:23
y estudiante
00:42:26
tiene materias
00:42:28
y materia tiene materia
00:42:29
esto es
00:42:31
absurdo
00:42:34
usar el plugin
00:42:36
y dejarte, a ver, no es absurdo
00:42:37
porque si lo haces solo
00:42:40
para la parte del xml, pues ya veis que esto
00:42:41
es ir tirando de puntito, completar y ya está
00:42:44
pero un modelo de clases
00:42:46
con tantas clases internas
00:42:47
para otras cosas que no fuera para xml
00:42:49
Pues si es que no lo generaríamos
00:42:52
Vale, pues nos vamos a hacer una materia
00:42:54
Que es
00:42:56
New, madre mía
00:42:56
No me digas que tengo que volver a escribir todo eso otra vez
00:43:00
Tiene que haber alguna forma
00:43:02
¿Eh?
00:43:04
Claro, pero
00:43:08
Y no puedo usar el new instance
00:43:09
Pero el new instance tengo que poner la clase otra vez
00:43:10
Con lo cual no ahorro nada
00:43:12
Entonces sí, venga, control c, control v
00:43:14
Que barbaridad
00:43:16
A ver, me puedo hacer el import, porque parecemos tontos
00:43:18
Claro
00:43:20
Porque el import también funciona
00:43:22
Para todo esto
00:43:25
También no solo con paquetes
00:43:27
Sino con clases internas
00:43:30
Es decir, yo puedo hacer un import
00:43:31
Y aquí me importo
00:43:34
Con .dam2
00:43:37
.todoelchorizoeste
00:43:40
De clases internas
00:43:42
Materias, materia
00:43:43
Con .dam2.model
00:43:46
Model, efectivamente
00:43:48
Me falta el model
00:43:49
Vale, me hago el import
00:43:51
Y no tengo que arrastrar eso todo el rato
00:43:56
Pongo materia y se acabó
00:43:57
Me hago materia
00:44:12
¿Cómo que no sabe a qué materia me refiero?
00:44:14
¿Me refiero a esta?
00:44:17
No, no, no
00:44:19
Es que si hubiera más materia sería
00:44:20
¿Es el nombre de la variable lo que lo distingue?
00:44:22
Claro, es como
00:44:25
Ah, que estuviera en otra línea
00:44:25
De clases internas, en otro import
00:44:31
Ah, bueno, ya claro, pero es que entonces no puedo hacer import
00:44:32
Claro, si hubiera otra clase materia en otra ruta del import
00:44:35
Él cogería la primera de todas siempre
00:44:38
Entonces no podría hacerlo así
00:44:41
¿Vale?
00:44:43
Pero claro, no es el caso
00:44:44
Entonces, materia.setCódigo
00:44:46
Pues esto no me acuerdo si era string o sería string, seguro
00:44:50
setCódigo1
00:44:54
Materia.setNombre
00:44:57
Acceso a datos
00:45:01
Materia.set
00:45:05
Nota
00:45:07
Un 10
00:45:09
Pero lo tengo que convertir
00:45:11
A big decimal
00:45:14
Y esto
00:45:15
Me dejará con el constructor
00:45:18
Porque fijaos que
00:45:20
El plugin
00:45:22
En lugar de double
00:45:23
Me lo ha puesto como big decimal
00:45:26
Entonces
00:45:28
No, el big decimal
00:45:29
Ah bueno
00:45:34
Import
00:45:36
Ah, pues sí, puedo hacer un big décima a través de un double normal y corriente
00:45:36
Vale, ya tengo la materia
00:45:41
¿La materia está dentro de qué?
00:45:42
La materia está dentro de materias
00:45:45
Entonces tendré que instanciar materias
00:45:46
Copia y pega del libro
00:45:49
Venga, esta es clase de velocidad
00:45:51
Este tipo de trabajos es que es el pan nuestro de cada día
00:45:53
Más que pensar
00:46:03
Vale, ya tengo materias aquí importado
00:46:04
De hecho, vamos ya a hacernos rápidamente
00:46:07
Todos los import con todas las clases que vamos a usar
00:46:11
Para no volvernos locos
00:46:14
Estudiante, ya la tengo
00:46:15
Ala, otro import
00:46:18
Estudiantes, ya lo tengo
00:46:21
Otro, carrera
00:46:25
Que bonito, de verdad
00:46:28
Pues en situaciones de estas os veréis
00:46:37
Y cosas más raras
00:46:45
Y el mundo del desarrollador es
00:46:46
Una cosa extraordinaria
00:46:48
Sí, ¿verdad?
00:46:50
Universidad
00:47:00
¿Ya las tengo todas?
00:47:00
Sí, ya tenemos la escalera perfecta
00:47:07
Universidad la tengo duplicada
00:47:09
Vale, la voy a quitar
00:47:12
Para que esté dentro de la escalera
00:47:13
Ay, qué bonito
00:47:14
Vale, pues ahora ya
00:47:18
Ahora ya nos hacemos
00:47:21
Materias
00:47:23
Igual a new
00:47:25
Materias
00:47:28
Y ahora
00:47:30
A materias punto
00:47:32
Get materias
00:47:34
Punto add
00:47:36
Materia, ojo
00:47:38
Habrá hecho el plugin la instanciación
00:47:40
Por defecto para que no la liemos
00:47:43
Con el null pointer, pues seguro que no
00:47:45
Pero yo que sé, bueno, digo seguro
00:47:47
Por decir, igual sí
00:47:49
Vamos a ver
00:47:50
Vamos a ver
00:47:52
Cómo ha hecho
00:47:54
Mal
00:47:55
Vámonos a
00:47:57
Materias, a ver cómo ha hecho materia
00:48:00
Vamos, vamos, vamos
00:48:02
Vamos
00:48:07
Va, no, me pasa, ah sí
00:48:08
Es la última de todas, claro
00:48:11
Venga, vamos, vamos
00:48:12
Vamos, vamos
00:48:15
Materias, vale, pero yo veo la propiedad
00:48:16
Universidad, facultades, no, estoy en el estudiante, aquí, vale, entonces, pues esta lista no la he instanciado por defecto, podría ser que el get fuera listo y diera, si es null, instánciame una lista nueva, pero no creo, ah, mira, sí, vale, es una construcción habitual realmente en muchos frameworks, que si es null, te lo instancie, con lo cual no vamos a tener problema en el null pointer exception.
00:48:19
Vale
00:48:53
Mira que bien
00:48:55
Pues hala, ya está
00:48:57
Ahora, ya tenemos la materia
00:48:58
Ahora hay que crear el estudiante
00:49:01
Y ponerle las tres cosas
00:49:02
No pasa nada, esto lo hacemos a toda leche
00:49:04
Estudiante
00:49:06
Al estudiante
00:49:11
Edad
00:49:20
23
00:49:21
E-mail
00:49:23
Cualquiera
00:49:29
Y de tres
00:49:32
Materias
00:49:38
Pues la lista que acabamos de hacer
00:49:45
Y nombre del estudiante
00:49:46
Juanito
00:49:52
Ala
00:49:53
Venga
00:49:55
Es que Pepitos no tenemos ninguno
00:49:56
Ah bueno, algún José hay, no hay ningún José en clase
00:49:59
Ah bueno, pues Juan Pepito
00:50:01
Vale, ya tenemos al estudiante
00:50:04
El estudiante va metido
00:50:08
Dentro de una lista de estudiantes
00:50:10
¿Verdad? Creo
00:50:12
Estudiantes
00:50:13
Estudiantes
00:50:15
Lo ha metido dentro de una lista
00:50:18
Todo esto por no hacer el graper
00:50:19
Así de vago
00:50:21
Ha sido
00:50:23
Y ahora a estudiantes.get
00:50:26
Ni lo miramos
00:50:30
Porque si ya en las materias
00:50:31
Ha hecho el get para que te instancie
00:50:33
Si no tiene nada, seguro que aquí también lo ha hecho
00:50:35
Así que
00:50:37
Ya tenemos estudiantes
00:50:39
Y ahora
00:50:41
Esta lista de estudiantes estaba en la carrera
00:50:44
Luego nos falta una carrera
00:50:46
Vale
00:50:49
La carrera tiene
00:50:57
Un código
00:50:59
Bueno, un departamento
00:51:01
Bla, bla, bla
00:51:03
Tiene un código
00:51:04
Bla, bla, bla
00:51:09
Tiene unos estudiantes que son los que acabamos de hacer
00:51:11
Y tiene un nombre
00:51:18
Carrera de mates
00:51:22
Y la carrera está en la facultad
00:51:24
Ah, perdón, jolines
00:51:28
De verdad
00:51:31
Ah, teníamos que haber cogido otro esquema
00:51:32
Esto no puede ser
00:51:36
Carreras
00:51:38
Y ahora ya sí
00:51:41
Cars.get.add
00:51:48
Carrera que acabamos de hacer
00:51:52
Y ahora ya sí que las carreras están en la facultad
00:51:53
Y la facultad tiene un nombre
00:52:00
Pues la facultad de mates
00:52:11
Y tiene unas carreras que acabamos de hacer
00:52:12
Perdón, set carreras
00:52:16
Punto set
00:52:24
Carreras, estas carreras que acabamos de hacer
00:52:25
Y ahora ya
00:52:28
Esto está en las facultades
00:52:30
Y en las facultades
00:52:32
Tiene una lista de facultades
00:52:44
A la que le añadimos
00:52:46
La facultad
00:52:48
Benditos imports
00:52:49
Porque si no, vale
00:52:55
Y las facultades están, ahora ya sí que sí
00:52:56
En la universidad
00:52:59
Y terminado
00:53:01
Podemos ya generar a ver si las clases están bien
00:53:02
Porque claro
00:53:05
Podrían no estar bien
00:53:05
La universidad
00:53:08
Vale
00:53:10
Y la universidad
00:53:17
Tiene su nombre
00:53:20
Universidad
00:53:21
Y la universidad tiene
00:53:23
Su lista de facultades
00:53:28
Que son los que acabamos de hacer
00:53:31
Y ahora esto
00:53:32
Podríamos mandarlo a un xml
00:53:34
Ni método aparte
00:53:36
Ni nada
00:53:38
Recordad que esto
00:53:39
Hacíamos un contexto
00:53:41
Que era
00:53:42
Juraría
00:53:47
Y lo instanciábamos
00:53:48
Con new instance
00:53:51
Y aquí le dábamos
00:53:53
La clase
00:53:55
Raíz
00:53:57
Y hacemos hasta un throw
00:53:58
Solamente queremos probar que las clases
00:54:07
Que ha generado están bien
00:54:10
Y ahora ya creábamos el
00:54:11
Marshaller
00:54:13
Que este yo creo que se hacía desde aquí
00:54:14
Create Marshaler
00:54:23
Y ahora
00:54:25
Al Marshaler
00:54:27
Le poníamos la propiedad
00:54:29
De que estuviera formateada
00:54:31
La salida
00:54:33
SetProperty
00:54:34
Y es
00:54:38
Esta propiedad
00:54:40
Yo creo que era una
00:54:43
Propiedad final del contexto
00:54:44
Jaxbeck
00:54:47
No era formate
00:54:48
Luego de aquí no puede ser
00:54:51
Porque solo me ofrece
00:54:55
Podría ser de marshaller
00:54:56
Imagino
00:54:59
Marshaller.si
00:55:00
Y a este a true
00:55:02
Vale, la propiedad del marshaller
00:55:06
Salida formateada se la ponemos a true
00:55:11
Y ahora ya
00:55:13
Hacemos el marshaller
00:55:15
Desde
00:55:17
Mi objeto
00:55:18
Unif
00:55:21
Y aquí poníamos el fichero
00:55:21
Universidad.xml
00:55:25
E importamos file
00:55:38
¿Por qué no se ha unido?
00:55:41
¿Cómo?
00:55:49
No, no quiero añadir esto
00:55:50
Espera, crear
00:55:52
File
00:55:53
Vale, ya está
00:56:04
Venga, no hemos tocado las clases que ha generado el plugin
00:56:08
Vamos a ver si nos genera un xml en condiciones
00:56:12
¿Error?
00:56:15
Universidad XML
00:56:19
Refresh
00:56:26
¿Vale?
00:56:28
Jolín, qué salida formateada tan horrible
00:56:35
¿Por qué materia me la ha puesto aquí?
00:56:37
Sí, sí
00:56:47
El tema es
00:56:47
¿Por qué?
00:56:49
Porque no me lo ha formateado bien
00:56:57
O sea, está bien
00:56:58
El XML está bien generado
00:56:59
Tiene todos los datos correctamente
00:57:01
Pero no sé por qué esto no me lo ha puesto bien
00:57:03
Igual es que ya tiene un límite
00:57:06
Dentro del cual ya deja de formatear
00:57:07
Cuando hay tantos internos
00:57:09
Qué raro, no lo sé
00:57:11
Pero bueno, lo ha generado bien y ya está
00:57:13
¿Vale?
00:57:15
No tendrá dinero suficiente
00:57:19
Para indexar más
00:57:20
A parte de la clase universitaria
00:57:24
nos ha generado aquí
00:57:33
este objeto
00:57:35
este objeto
00:57:40
object factory
00:57:42
es como su nombre indica
00:57:44
una factoría de objetos
00:57:46
de la que podemos pasar
00:57:48
completamente
00:57:50
entonces, una factoría de objetos
00:57:51
¿qué hace? crear objetos
00:57:54
efectivamente, me está creando
00:57:56
simplemente instancias
00:57:58
instancias
00:58:01
de los objetos de mi contexto
00:58:02
de Jax B
00:58:04
vale
00:58:05
universidad facultades me ofrece un
00:58:07
create
00:58:10
para cada uno de los objetos de mi contexto
00:58:11
vale
00:58:14
es una factoría de objetos
00:58:16
entonces tiene sentido
00:58:18
usar esta factoría de objetos
00:58:20
en un caso muy concreto
00:58:22
en el contexto de Jax B si
00:58:24
porque a ver
00:58:25
podría ocurrir que por la razón
00:58:26
que fuera
00:58:30
esta clase mía universidad
00:58:31
esto lo menciono solo, no vamos a trabajarlo
00:58:36
porque es que no merece la pena seguir insistiendo más en el XML
00:58:39
podría ocurrir que aquí no existiera
00:58:41
la anotación XML root element
00:58:44
porque esto estuviera dentro de otra jerarquía
00:58:46
es decir, que hubiera otra clase por ahí
00:58:49
que es la verdadera clase raíz que tiene una universidad dentro
00:58:52
entonces aquí no estaría el XML root element
00:58:56
sino que estaría en la otra clase
00:59:00
que esa otra clase tiene una propiedad universidad dentro
00:59:01
que es un subnodo de ella
00:59:05
pero puede ocurrir que en un momento dado
00:59:06
yo quiera hacer un XML que solo tenga esta parte
00:59:09
entonces si quiero hacer un XML que solo tenga esta parte
00:59:12
tendría que venirme aquí
00:59:15
poner el XML root element
00:59:16
generarlo y luego quitarlo
00:59:19
porque en realidad esta clase universidad
00:59:21
está dentro de otra clase
00:59:24
que es la que sí que tiene el root element
00:59:26
No sé si me explico la situación a la que me refiero.
00:59:28
Sí, ¿no?
00:59:32
Vale, pues si estoy en esta situación
00:59:32
y yo tengo que generar un sub-XML, entre comillas,
00:59:35
que solo tenga de universidad hacia abajo
00:59:39
y no puedo poner aquí el XML root element
00:59:41
porque no puedo entrar al código fuente para cambiarlo,
00:59:44
pues ahí es donde entra en ese contexto
00:59:48
y solo en ese que a mí se me ocurra,
00:59:51
en el que tiene sentido el Object Factory.
00:59:54
¿Por qué? Porque el ObjectFactory genera objetos, pero tiene una anotación aquí, una anotación que nos pasa por alto, que es una anotación de JaxB.
00:59:58
Entonces, esta anotación hace que estos objetos tú los puedas instanciar no solo como el propio objeto universidad, sino como JaxB element.
01:00:08
Es decir, tenemos aquí una
01:00:19
Tenemos una clase
01:00:23
Que no hemos
01:00:26
Trabajado, pero nos ha hecho falta
01:00:27
Y no hace falta a la mayoría de los
01:00:29
Que es JaxbElement
01:00:30
¿Vale?
01:00:33
Por ejemplo, me voy a hacer un JaxbElement
01:00:35
Asociado a universidad
01:00:37
¿Vale?
01:00:39
Entonces
01:00:45
Esto
01:00:45
No me acuerdo como se instanciaba
01:00:47
JaxbElement
01:00:50
Ah, con el ObjectFactory
01:00:52
Eso vale
01:00:56
Claro
01:00:58
ObjectFactory
01:00:59
Factory
01:01:02
Punto
01:01:04
A través del ObjectFactory
01:01:06
Lo instancias, pero necesitas
01:01:09
El ObjectFactory, claro
01:01:10
Necesitas crear porque no es el método estático
01:01:12
Necesitas crear
01:01:14
El ObjectFactory
01:01:16
Cuidado con el
01:01:18
Veis la cantidad de import
01:01:33
Que hay para cualquier cosa
01:01:36
Y ahora este object factory
01:01:37
Te permite ahora ya si
01:01:40
Crear
01:01:42
Una
01:01:44
Crear una universidad
01:01:46
Vale
01:01:51
Y aquí me falta el punto y coma
01:01:53
Efectivamente
01:01:55
Y aquí me falta
01:01:56
Importar
01:01:59
Jaxpe element
01:02:01
Y aquí yo puedo hacer un casting
01:02:02
sin problema
01:02:05
no, pero no quiero hacer esto
01:02:07
no, es que no quiero hacer esto
01:02:18
porque yo quiero un Jaxby element
01:02:22
aquí
01:02:24
haces un casting, vale, es que no quiero que
01:02:27
lo quería solo mencionar por encima
01:02:33
no quiero que nos
01:02:34
Jaxby element de
01:02:36
adversidad
01:02:38
Porque no puedes hacer
01:02:40
A ver, espera
01:02:48
Antes de seguir pidiendo el tiempo probando
01:02:50
Voy a
01:02:52
Preguntárselo a este
01:02:54
¿Cómo
01:02:56
Instancio
01:02:59
Un Jaxb
01:03:01
Element
01:03:04
Con mi
01:03:05
Object
01:03:07
Factory? Seguro que sabe a lo que me refiero
01:03:10
Bueno
01:03:12
Bueno, el factory es el object factory
01:03:30
Llamas al método
01:03:32
Y yo lo que no le he pasado es el
01:03:35
Ah, vale, vale, vale
01:03:37
Claro, es que no le he pasado
01:03:41
Vale, vale, vale, vale, es que no le he pasado el este
01:03:42
Lógicamente, es que soy imbécil
01:03:44
Vale, a ver
01:03:46
Tenemos que dar el elemento asociado
01:03:48
Lógicamente
01:03:51
Asociado
01:03:52
A la universidad que yo acabo de hacer
01:03:54
Claro
01:03:56
Vale
01:03:58
Y ya, claro
01:04:01
Que no le pasa al parámetro
01:04:03
Y luego
01:04:04
Ya está
01:04:07
Vale
01:04:16
Vale, vale, es que no le había pasado esto
01:04:19
Y aquí que me dice
01:04:21
Es que este object factory
01:04:24
No está bien
01:04:35
Es que este object factory
01:04:37
Un momentito, vale, de xml
01:04:48
Que nos falta
01:04:56
Muy poca cosa
01:04:58
Solamente
01:04:59
voy a mencionar, por mencionarlo
01:05:02
por mencionarlo y podemos ver un ejemplo
01:05:04
de cómo es, pero sin hacerlo ni practicarlo
01:05:06
no lo voy a preguntar en el examen
01:05:08
¿vale?
01:05:10
estas tecnologías que hemos visto
01:05:12
DOM y JaxB
01:05:13
todas ellas están basadas
01:05:15
en volcar
01:05:20
todo el contenido de mi XML
01:05:21
en memoria principal
01:05:24
bien sea en una variable document
01:05:25
o bien sea en mis entidades
01:05:27
siempre mejor esta opción
01:05:30
porque mis entidades aparte juegan
01:05:32
en la aplicación en más bandos, juegan haciendo
01:05:34
cosas por otras partes, aquí el document
01:05:36
solo juega para el xml
01:05:38
luego es una carga en ram
01:05:40
innecesaria, siempre mejor esto
01:05:42
¿vale? porque aprovecho mis propios
01:05:43
objetos que hacen cosas para serializarse
01:05:46
¿vale? pero
01:05:49
si nosotros el aprovechar
01:05:51
mis propios objetos que están ahí
01:05:54
haciendo cosas para serializarse
01:05:56
Pues no es interesante porque yo solamente quiero la parte de XML y no quiero cargarlo todo en memoria como DOM, pues puedo usar una tercera herramienta, SACS, que os suena el nombre, SACS, que es para serializar XML, ¿verdad?
01:05:58
pero esto vale solo para leer
01:06:14
esta tecnología
01:06:16
vale solamente para leer
01:06:18
XML en plan rápido
01:06:21
y sin cargar la memoria principal para nada
01:06:22
y está basado
01:06:25
en eventos
01:06:27
en lo que podría ser remotamente
01:06:29
una programación reactiva
01:06:32
pero no, en realidad no
01:06:35
¿vale? entonces
01:06:36
¿en qué está basado SACS?
01:06:38
pues tú declaras una clase
01:06:40
vamos a ver un ejemplito para que no se quede demasiado
01:06:42
tú declaras una clase
01:06:44
y declaras lo que vas a hacer
01:06:46
según pasen
01:06:49
eventos una vez que has lanzado
01:06:50
un proceso, entonces el proceso
01:06:52
que tú vas a lanzar es
01:06:54
enganchar el xml a un flujo
01:06:56
de entrada, eso es el proceso
01:06:58
que vamos a lanzar en nuestro
01:07:01
main, nuestro main lo que hace es
01:07:03
enganchar el xml a un flujo
01:07:05
de entrada, entonces desde el momento en el que
01:07:07
el xml se engancha al flujo
01:07:09
de entrada, empiezan a salir por ahí
01:07:10
las cositas que están en el PSML.
01:07:13
Empiezan a salir por ahí.
01:07:14
Por ejemplo, el arranque de un nodo,
01:07:16
el cierre de un nodo,
01:07:19
el arranque de un nodo texto,
01:07:20
el cierre del nodo raíz.
01:07:22
Empezan a pasar cosas según van saliendo.
01:07:24
Empiezan a pasar cosas.
01:07:26
Bueno, pues resulta que yo en una clase
01:07:28
he programado
01:07:30
qué quiero hacer según vayan pasando
01:07:32
mis cositas. Nodo que se abre,
01:07:34
nodo que se cierra, nodo texto que se abre.
01:07:36
¿Qué programaré ahí?
01:07:39
pues lo que quiera, pues coger el contenido
01:07:40
y mostrarlo, coger el contenido
01:07:42
e ignorarlo, coger el contenido y llevarlo a variables
01:07:44
lo que yo quiera, entonces aquí
01:07:47
no se guarda nada en memoria RAM
01:07:48
aquí van llegando las cosas
01:07:50
las procesos, según haya
01:07:52
puesto yo en mi clase, las procesos
01:07:54
y van a la basura
01:07:56
van llegando las procesos
01:07:57
y a la basura, van llegando las procesos
01:08:00
y a la basura, esta es una programación
01:08:02
basada en
01:08:05
captura de puntos
01:08:06
¿vale? una
01:08:08
un diseño habitual en otros contextos
01:08:09
como en interfaces gráficas
01:08:13
etcétera
01:08:14
y es el que motiva
01:08:16
motivó la actual programación reactiva
01:08:18
vale pues
01:08:21
vamos a verlo en un ejemplito
01:08:22
y ya está
01:08:25
para que no se quede así
01:08:26
por ejemplo
01:08:31
aquí tendré un ejemplo
01:08:33
del año pasado
01:08:42
Vale, pues esto de aquí
01:08:46
Por ejemplo, tenemos aquí un archivo cualquiera
01:09:36
Del que quiero leer
01:09:42
Y solo leer
01:09:44
Porque SACS es solo para leer rápido
01:09:45
Y sin cargar la memoria principal
01:09:47
Quiero solamente leer
01:09:49
Vale, pues para leer mi main
01:09:50
¿Qué va a hacer?
01:09:53
Mi main lo único que va a hacer va a ser
01:09:55
Bueno, instanciar
01:09:56
Como siempre, el que va a parsear
01:09:57
Este parser que se instancia
01:10:01
Desde una factoría
01:10:02
como casi siempre
01:10:03
vale, y ahora
01:10:05
aquí se lanza
01:10:07
el parse
01:10:09
entonces desde el momento en que se lanza
01:10:10
el parse
01:10:14
¿qué empieza a pasar? que este fichero
01:10:14
entra en una especie de tubería
01:10:18
y va metiendo ahí sus cosas
01:10:20
pa pa pa pa
01:10:22
y según van saliendo las cosas por el otro lado
01:10:22
esta clase
01:10:26
va decidiendo qué hacer con ellas
01:10:27
bueno, pues esta clase
01:10:29
este objeto es el que tendremos que haber
01:10:31
declarado nosotros
01:10:33
luego la lectura del
01:10:35
xml consiste en
01:10:37
un parser
01:10:39
lanza que el xml
01:10:41
empiece a llegar por una tubería
01:10:43
el xml va saliendo
01:10:45
por la tubería y este objeto que yo he
01:10:47
programado decide que hago
01:10:49
con cada cosa que pase
01:10:51
y ya está
01:10:52
¿vale?
01:10:54
ahora, claro, eso lo tendremos que haber declarado, vamos a ver
01:10:56
¿cómo declaramos todos pedidos handler? bueno, pues pedidos handler
01:10:58
es
01:11:01
esta clase de aquí
01:11:03
que tiene que ser un manejador
01:11:06
por eso lo heredo de un manejador
01:11:09
vale, y yo aquí programo
01:11:10
lo que quiera, siempre y cuando
01:11:12
sobreescriba los métodos
01:11:15
de un manejador por defecto
01:11:16
vale, entonces
01:11:19
¿qué métodos tengo que sobreescribir?
01:11:20
bueno, los que yo quiera, no todos
01:11:23
porque esto no es una implementación de una interfaz
01:11:25
es una herencia, entonces no estoy
01:11:27
obligada a sobreescribirlos todos
01:11:29
Vale, pues el método StartElement
01:11:30
Aquí escribo lo que quiero yo que pase
01:11:33
Cuando llegue el evento de que arranca un nodo
01:11:36
En este caso, pues si el nodo es cliente
01:11:39
Quiero que hagas no sé qué
01:11:42
Este método, este método es el que arranca
01:11:43
Cuando llegue un nodo texto
01:11:48
Cuando llegue un nodo texto
01:11:49
Pues aquí tenía puesto lo que quiero que pase
01:11:51
Cuando llegue un nodo texto
01:11:54
Esto es lo que yo quiero que pase
01:11:55
Cuando llega la etiqueta de cierre
01:11:58
Pues aquí tengo puesto lo que pasa, etc.
01:12:00
Vale, este manejador lo programo yo.
01:12:03
Entonces, en particular, ¿qué es lo que quiero que haga?
01:12:05
Este en particular iba yo cogiendo las cosas que iban llegando y las iba guardando en una lista de objetos.
01:12:07
Las iba guardando ahí, ¿vale?
01:12:13
Y luego ofrecía un método para sacarlo.
01:12:15
Bueno, pues mi lectura se convierte en muy ligera.
01:12:18
hago el parse, este manejador va haciendo
01:12:21
lo que yo le haya dicho que haga con cada cosa que va pasando
01:12:25
en secuencia dentro de este xml
01:12:28
y dentro del handler se habrá quedado mi objeto pedidos
01:12:32
y ya está, entonces que sepáis que existe
01:12:36
una forma más ligera de leer de un xml, solo de leer
01:12:43
que es esta tecnología, sax, voy a subir el proyecto
01:12:46
como ejemplo para que esté ahí subido el ejemplo
01:12:53
pero bueno, no voy a preguntar
01:12:55
nada en el examen de esto
01:12:57
pero lo único que quiero es que os suene
01:12:58
para que se quede completo
01:13:00
lo de XML
01:13:03
y con esto damos por terminado
01:13:04
XML por siempre
01:13:07
jamás, salvo que hay ficheros de configuración
01:13:09
que son XML
01:13:12
y que muchos frameworks
01:13:13
usan XML
01:13:17
para muchas cosas, con lo cual
01:13:19
tendrán que usar JaxB
01:13:21
Y puede que alguno de los fallos
01:13:22
Cuando yo estoy haciendo cualquier cosa
01:13:25
Con algún framework
01:13:26
Uno de los millones de fallos que pueden salir
01:13:27
Puede decir a la palabra clave
01:13:30
Jaxb
01:13:33
Entonces, pues ya sabemos a qué se refiere
01:13:33
Tiene algún fichero de configuración xml
01:13:36
No lo está sabiendo leer internamente
01:13:38
A lo mejor me falta dependencia de Jaxb
01:13:39
O la versión que he puesto
01:13:41
No es compatible con la de mi framework
01:13:44
Entonces la dependencia de Jaxb
01:13:46
La usan internamente muchos frameworks
01:13:47
Porque necesitan parsear xml
01:13:49
hombre no
01:13:51
porque todo esto formaría parte
01:13:56
del
01:13:58
toda la granja o como lo queráis llamar
01:13:59
o granja o universo o ecosistema
01:14:02
de Java
01:14:04
pues esto es una cosa más dentro de esa enorme
01:14:05
granja
01:14:08
entonces pues el tema es que
01:14:09
claro, cuando vosotros decís que sabéis
01:14:12
Java, no vale con
01:14:14
decir yo sé hacer un programa en Java
01:14:16
eso lo sabe hacer cualquiera
01:14:18
vosotros tenéis que decir que sabéis
01:14:19
Raquel me dio Java
01:14:22
No, eso tampoco
01:14:23
Porque
01:14:25
Que sabéis de tecnologías Java
01:14:25
Hombre, ahora mismo nos faltan muchas
01:14:29
Pues claro, nos faltan frameworks de acceso a datos
01:14:31
Nos falta Spring
01:14:33
Nos falta conocer muchas cosas
01:14:34
De ese ecosistema enorme
01:14:37
Pero tenéis que haceros valer a que
01:14:38
No sabéis Java a nivel
01:14:40
Hacer una aplicación en Java
01:14:42
Sabéis Java a nivel aplicaciones empresariales
01:14:44
Y sabéis Spring
01:14:47
Y sabéis muchas cosas
01:14:48
Sabréis o conoceréis por encima
01:14:50
Pero podéis decir que sabréis
01:14:52
y sabéis programación
01:14:53
reactiva, la conoceréis
01:14:55
por encima, pero bueno, podéis decir
01:14:58
que sabréis, vale, ese tipo
01:15:00
de cosas, y ya está
01:15:02
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 8
- Fecha:
- 31 de octubre de 2025 - 12:16
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 15′ 05″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 361.43 MBytes