Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 12-03-24 - 1 - 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:
Bueno, pues a partir de la idea, de la idea de gestionar un conjunto de discos, ¿vale? Pues, bueno, pues mi colección de, ¿vale? Entonces, la discoteca tiene una temática.
00:00:02
Tienes que crear
00:00:35
Claro, porque Remusol necesita una colección
00:00:44
Entonces tienes que pasarle una colección
00:00:46
Que hayas creado previamente
00:00:48
Bueno, pues entonces
00:00:49
String temática
00:00:52
Y ahora vamos a hacer que la discoteca tenga
00:00:54
Una lista de discos
00:01:04
¿Vale?
00:01:07
Pero discos
00:01:08
Que sea una interfaz
00:01:10
Porque como podemos tener varios tipos de discos
00:01:11
Podemos tener, vamos a inventarnos
00:01:13
Yo que sé, cualquier chorrada
00:01:15
Pues
00:01:16
Es que solo se me ocurre vinilo
00:01:17
O CD
00:01:26
Y habría que poner
00:01:28
Características, venga
00:01:30
Aunque salga cosarra, vamos a hacerlo así
00:01:32
¿Vale? O sea
00:01:34
La discoteca se caracteriza por la temática
00:01:35
Esta es sobre rock, vale
00:01:38
Ya está, mi temática es sobre rock
00:01:40
y tengo un conjunto de discos en ella
00:01:42
que voy a gestionar
00:01:44
que son de diferentes tipos
00:01:45
pero yo me voy a crear una interfaz
00:01:48
disco, una interfaz disco
00:01:50
y lo que tenga
00:01:53
en esa discoteca van a ser
00:01:55
discos, del tipo que sea, no lo sé
00:01:56
y ahora ya pues podemos
00:01:59
hacer aquí un constructor
00:02:03
con los parámetros
00:02:05
bueno, un gettyset
00:02:13
perdón
00:02:15
y un constructor
00:02:16
y un constructor sin parámetros
00:02:19
vale, y list
00:02:30
lo podemos importar de java útil
00:02:40
bueno, no me...
00:02:42
luego lo importamos cuando tengamos disco hecho
00:02:45
vale, entonces, ahora esta
00:02:46
aplicación se amplía
00:02:48
porque ahora ya discos
00:02:51
decidimos que podemos tener varios
00:02:52
tipos de discos y cada uno de ellos funciona
00:02:54
de una manera distinta, entonces hacer
00:02:56
una única clase disco
00:02:58
que recoja todo
00:03:00
pues a lo mejor embarbulla la aplicación
00:03:02
entonces decidimos, no, mejor tengo
00:03:04
dos clases, para dos tipos de discos distintos
00:03:07
y dejo que disco sea
00:03:09
la interfaz que la implementan
00:03:11
y ya está, pues por ejemplo
00:03:12
lo estoy haciendo sobre la marcha
00:03:14
para ver situaciones que nos van dando
00:03:16
vale, pero antes que lo entendamos
00:03:18
bueno, pues en ese caso disco sería una interfaz
00:03:20
y entonces
00:03:22
todos mis discos van a ser
00:03:24
implementaciones concretas de esta interfaz
00:03:26
pero algunos serán
00:03:28
discos de vinilo y otros de eso
00:03:30
como se quiera ver
00:03:32
Bueno, pues entonces vamos a crear esa interfaz disco
00:03:33
Bueno, y aquí
00:03:36
Aquí
00:03:47
¿Qué propiedades comunes van a tener?
00:03:49
No, perdón, es una interfaz
00:03:53
Aquí no hay propiedades, olvidadlo
00:03:54
Vale, entonces aquí podríamos decir
00:03:55
A ver, ¿qué funcionalidades queremos asociar
00:03:58
A los discos?
00:04:00
A todos ellos, sean de vinilo o sean de CD
00:04:01
Me da lo mismo
00:04:04
Pues por ejemplo
00:04:04
Todos ellos nos vamos a querer a lo mejor reproducir
00:04:06
Por ejemplo, ¿no?
00:04:09
pues vamos a suponer que hacemos un método
00:04:11
que se llama
00:04:13
reproducir
00:04:16
vale, me da igual que la aplicación
00:04:18
tenga mucho sentido o no lo tenga
00:04:24
ahora mismo lo que queremos es
00:04:25
practicar con el funcionamiento
00:04:27
de interfaces, colecciones, todo eso
00:04:30
una interfaz, pues método abstracto
00:04:32
vale, no hace falta que ponga public
00:04:37
porque por defecto todas las interfaces
00:04:40
sus métodos son public
00:04:42
vale
00:04:44
Podría dar una implementación por defecto
00:04:44
Hay cosas de interfaces
00:04:48
Que no hemos visto
00:04:50
Para no embarullar
00:04:51
Ya saldrán, ya irán saliendo
00:04:53
Para nosotros
00:04:55
Ahora mismo una interfaz es una colección
00:04:57
De métodos vacíos
00:04:59
Que luego ya las clases que los implementen
00:05:01
Decidirán cómo lo hacen
00:05:03
Y luego además puede haber
00:05:05
Constantes ahí
00:05:07
Porque si hay información interesante
00:05:09
Relevante para todos los discos
00:05:11
para todos, entonces puedo meter
00:05:13
ahí una constante a lo mejor, pero si no
00:05:15
necesito eso, pues no lo pongo
00:05:17
¿vale? ¿algún otro método que se le ocurra
00:05:19
a alguien que puedan
00:05:21
alguna otra funcionalidad
00:05:22
asociada a todos los discos? bueno
00:05:25
vamos a dejar una y ya está, como siempre lo mismo
00:05:27
¿vale? pues entonces
00:05:29
disco ya lo
00:05:31
tenemos, ya ponemos aquí importar list
00:05:33
entonces aquí
00:05:35
ya sí que no puedo hacer
00:05:38
esa protección
00:05:41
entre comillas que hacíamos a veces
00:05:43
oye, no pasa nada
00:05:45
vamos ya directamente a inicializar
00:05:46
esta propiedad, a inicializarla
00:05:49
creando una lista vacía
00:05:51
y así cuando
00:05:52
se crea un objeto discoteca
00:05:55
inicialmente no tiene discos, a menos que
00:05:56
luego yo se los vaya metiendo en el set o lo que sea
00:05:59
pero al menos esto no es nul
00:06:01
entonces eso
00:06:03
siempre es un protege
00:06:05
porque si alguien usa esa clase
00:06:06
y de partida se pone a meter aquí
00:06:09
y esto es null inicialmente
00:06:11
le va a ser null pointer exception
00:06:14
entonces recordad que decíamos
00:06:15
bueno, no es mala práctica
00:06:17
si yo tengo una propiedad que es una colección
00:06:18
en una clase, aprovechar y dejarla
00:06:21
instanciada
00:06:24
y me aseguro
00:06:25
uy, perdón
00:06:27
¿vale? y me aseguro
00:06:28
de que no me va a seguir el null pointer exception
00:06:42
¿vale?
00:06:43
lo único es que insisto
00:06:48
Aquí uno ya se está comprometiendo
00:06:49
A la implementación
00:06:53
No pasa nada, luego uno puede usar
00:06:54
Esta clase y sobreescribir
00:06:56
Discos con otra colección, si le interesa
00:06:59
¿Vale? Sobreescribirla
00:07:01
Bueno, pues esto es simplemente
00:07:02
De cara a, oye
00:07:05
Que de partida no sea nul
00:07:06
No vaya a ser que alguien me use mal, no verifique
00:07:08
Que esto no existe
00:07:10
Se ponga a hacer un add
00:07:12
¿Vale? Bueno
00:07:13
¿Vale? Pues entonces
00:07:15
Ahora
00:07:18
los discos
00:07:19
aquí es donde hemos decidido, nos hemos dado cuenta
00:07:21
que hay dos tipos de discos
00:07:23
pues entonces me hago una interfaz que unifique
00:07:25
lo común, en este caso lo común
00:07:28
se ha quedado muy escasito, se ha quedado en reproducir
00:07:30
pero bueno, unifica
00:07:32
lo común y ahora yo me hago ya
00:07:34
dos
00:07:35
implementaciones de esta interfaz
00:07:37
pues entonces
00:07:39
tengo
00:07:43
vinilo que implementa
00:07:45
disco, entonces al implementar
00:07:57
disco tiene que obligatoriamente
00:07:59
añadir
00:08:01
la
00:08:05
implementación de este método
00:08:07
que habría que decidirla, claro
00:08:09
cómo se reproduce el vinilo
00:08:12
por lo pronto vamos a caracterizar sus propiedades
00:08:14
pues las propiedades del vinilo
00:08:17
que sean, pues por ejemplo
00:08:19
el título
00:08:21
y la colección
00:08:21
de algo que lo pueda
00:08:30
distinguir de un CD que solo tenga un vinilo
00:08:32
que no tenga un CD
00:08:34
vosotros
00:08:35
claro
00:08:38
vosotros un vinilo
00:08:38
no sabéis ni lo que es
00:08:39
eso que adornan
00:08:40
las habitaciones infantiles
00:08:41
¿no?
00:08:42
digamos
00:08:43
¿eh?
00:08:43
hombre
00:08:47
los frikis de la música
00:08:47
lo siguen comprando
00:08:48
bueno
00:08:49
pues una cosa
00:08:52
que puede caracterizar
00:08:53
a los vinilos
00:08:54
que no caracterizan
00:08:55
a los CDs
00:08:55
puede ser el radio
00:08:56
porque los había pequeñitos
00:08:57
y grandes
00:08:58
¿no?
00:08:58
entonces
00:09:02
es por poner una propiedad
00:09:02
que tenga sentido
00:09:03
que esté aquí
00:09:04
y que no esté en el otro sitio
00:09:05
Venga, pues ala, el radio
00:09:06
Es que ni siquiera sé si se llamaba radio
00:09:09
¿Cómo se llamaba eso?
00:09:13
Eran de 45 y de 33
00:09:14
Ah, no, eso eran los disquetes
00:09:16
No, los disquetes eran de 5 y medio y 3 y cuarto
00:09:17
No, de 3 y medio y 5 y cuarto
00:09:21
Y los vinilos eran de 45 y de 33 revoluciones
00:09:23
Vale
00:09:26
Claro, los pequeñitos tenían que ir a 45 revoluciones
00:09:27
Y los grandes a 30
00:09:30
Bueno, da igual
00:09:31
Número de revoluciones por minuto
00:09:32
Esto es lo que caracteriza
00:09:36
El vinilo, que esto en un CD no tiene sentido
00:09:38
Obviamente
00:09:40
Vale, y ahora
00:09:41
La colección de
00:09:43
Número de revoluciones por minuto
00:09:45
Venga, estamos a dejarlo así, sin nada más
00:09:52
Ya está
00:09:54
Pues reproducir
00:09:54
Reproducir el vinilo
00:09:57
Pues vamos a hacer que sea
00:09:59
mostrar un mensajito reproduciendo
00:10:01
este, ya está
00:10:07
y aquí ponemos rápidamente los get y los set
00:10:12
y un constructor sin parámetros
00:10:16
para ir rápidos
00:10:25
no le ponemos constructores, con lo cual se queda uno sin parámetros
00:10:29
y luego ya podemos fijar con get y set y ya está
00:10:32
vale, y ahora vamos a hacer el otro
00:10:35
el cd, pues el cd también
00:10:37
implementadisco
00:10:53
implementadisco
00:10:57
y aquí sus propiedades van a ser
00:11:00
también el título
00:11:01
el título es común en ambas
00:11:03
pero no lo hemos podido poner en la interfaz
00:11:09
porque la interfaz no admite propiedades
00:11:11
si hubiéramos hecho otro diseño con una clase abstracta
00:11:13
pues entonces sí
00:11:15
podríamos haber puesto título en la clase abstracta
00:11:17
pero como es una interfaz
00:11:19
ahí no puede haber propiedades
00:11:21
y aquí le vamos a poner que el cd se caracteriza
00:11:22
por un conjunto de pistas
00:11:25
de pistas
00:11:27
y va a ser un conjunto
00:11:29
con lo cual no van a tener posición
00:11:42
sino que hay que seleccionarlas por el nombre
00:11:44
de la pista
00:11:47
por el nombre, vale
00:11:48
un conjunto de pistas, va a tener el cd
00:11:50
vale, luego
00:11:52
hacemos este método, vamos a hacerle los get y los set
00:12:12
para que
00:12:15
para quitarlos de en medio
00:12:17
cuanto antes, los get y set de esto
00:12:21
sin constructor, constructor sin parámetros
00:12:23
vale, importamos set
00:12:33
no me deja todavía hasta que no
00:12:34
bueno, entonces
00:12:37
pista es otra clase a propósito
00:12:38
es otra clase que pista va a tener
00:12:41
dos propiedades
00:12:43
el título y la duración
00:12:44
y ya está, pues vamos a crear
00:12:46
la clase pista
00:12:49
con el título de la pista
00:12:49
y la duración
00:12:56
get y set
00:13:03
bueno, a ver, pista
00:13:09
Pista no es superclase
00:13:17
Ni subclase
00:13:20
No, pero pista no hereda de CD
00:13:21
O sea, pista está en CD
00:13:24
O sea, un CD
00:13:26
Tiene pistas dentro
00:13:28
Pero eso no es heredar, eso es composición
00:13:29
O sea, esa relación está aquí ya
00:13:32
Es decir, un CD
00:13:34
Tiene pistas dentro
00:13:35
O sea, hay una relación que es
00:13:37
Una clase contiene dentro la otra
00:13:39
Esa relación de composición
00:13:42
Y una es heredar, que es
00:13:43
Una clase es la otra
00:13:45
Entonces la relación de herencia sería
00:13:47
Si yo puedo decir
00:13:49
Una pista es un CD
00:13:50
No, una pista no es un CD
00:13:52
Una pista está en un CD
00:13:54
Entonces cuando tú tienes dos entidades
00:13:56
Se puede relacionar como
00:13:58
Esta es esta
00:13:59
O esta está en esta
00:14:00
Si tú puedes decir
00:14:02
Esta es esta
00:14:03
Una hereda de la otra
00:14:05
¿Perdón?
00:14:06
Efectivamente
00:14:12
entonces una pista está en un CD
00:14:13
pero una pista no es un CD
00:14:16
entonces no puedes hacer pista
00:14:17
extens CD
00:14:19
esa relación será que dentro
00:14:20
de CD, dentro, aparece
00:14:23
esto, dentro, que es la relación
00:14:25
de composición, en realidad
00:14:27
esto se llama composición, un CD
00:14:29
está compuesto de pistas
00:14:31
está compuesto de pistas
00:14:33
vale, pues ya tenemos
00:14:34
nuestra
00:14:37
pista con duración y
00:14:38
título y ya está
00:14:41
y el cd que contiene pistas
00:14:42
y tengo que importar
00:14:46
set
00:14:48
y poner esto bien, claro
00:14:49
vale, reproducir
00:14:52
pues el método reproducir de cd va a cambiar
00:14:57
un poco, porque ahora el método
00:14:59
reproducir, en un vinilo
00:15:01
hemos asumido que cuando tú le das a reproducir
00:15:03
¡pam! reproduce
00:15:06
porque no va a haber ningún humano ahí
00:15:07
moviendo la agujita
00:15:09
hemos querido asumir eso, entonces tú le das a reproducir
00:15:11
y es, está reproduciendo patatín
00:15:13
vale, pero aquí
00:15:15
reproducir
00:15:18
vamos a hacerlo que solicite una pista
00:15:19
vale
00:15:22
la localice
00:15:24
y te diga voy a reproducir
00:15:25
pista con la duración tal
00:15:28
y deje el sistema
00:15:30
ahí parado
00:15:32
todos los segundos que dure la pista
00:15:34
por ejemplo, para cambiar
00:15:36
vale, pues entonces este método de reproducir
00:15:37
solicita un nombre de pista
00:15:40
y deja ahí
00:15:41
Nuestro programa
00:15:44
Parado
00:15:47
Todo el tiempo que dura la pista
00:15:48
Es nuestra forma de emular
00:15:50
Que está reproduciendo una pista
00:15:53
Vale, pues entonces aquí tenemos que
00:15:54
Pedir una pista
00:15:57
Localizarla en el set
00:15:58
Para sacar de ella
00:16:01
Su duración
00:16:03
Vale
00:16:05
Bueno, pues entonces
00:16:08
Bueno, tengo que importar haset
00:16:10
Pues nada, este reproducir pista
00:16:12
Va a ser
00:16:17
Título de pista
00:16:18
Dime el título de pista que quieres
00:16:21
Pues leemos la pista
00:16:23
Voy a meter
00:16:28
La otra clase
00:16:30
Ah, que ya la tenía, vale
00:16:31
Claro, que estoy en el mismo proyecto
00:16:35
Vale, pues el título mío de pista
00:16:37
Lo leo
00:16:43
Y ahora ya tengo
00:16:46
El dato de entrada
00:16:51
El dato de entrada no lo he puesto que lo reciba por parámetro
00:16:52
Porque reproducir es el método
00:16:55
que implementa la
00:16:59
interfaz, entonces
00:17:00
la cabecita tiene que ser idéntica, clavada
00:17:02
yo me podría hacer otro método aparte
00:17:04
me lo podría hacer, pero este le tengo
00:17:07
que implementar sí o sí
00:17:09
el que está en la interfaz, y la interfaz me dice
00:17:10
oye, implementa un método reproducir sin
00:17:13
parámetros, pues lo tengo que hacer así
00:17:15
bueno, pues nada, título de pista
00:17:16
y ahora que tenemos que hacer aquí, pues hemos dicho
00:17:18
vamos a buscar en las pistas
00:17:20
y cuando
00:17:22
la encontremos, pues ya está
00:17:24
que reproduzca, entonces aquí
00:17:26
Podemos hacer varias cosas
00:17:28
Por ejemplo, podríamos hacer
00:17:29
Sí, pista ya la he hecho para que tenga título y duración
00:17:31
Una pista de un CD
00:17:40
Se caracteriza por su título y su duración
00:17:41
Nada más, ya está
00:17:43
Estoy obviando las posiciones
00:17:44
En un CD sí que tiene posiciones
00:17:46
La 1, la 2, la 3, pero las he obviado
00:17:49
Para usar un set precisamente
00:17:51
Bueno, pues entonces
00:17:52
Vamos a imaginarnos
00:17:56
Que yo ahora quisiera ver primero de todos
00:17:59
Imaginaos que yo quiero comprobar
00:18:01
que esta pista está en el CD
00:18:03
lo primero de todos
00:18:06
la puedo recorrer y comprobarlo
00:18:08
o también podría hacer esto
00:18:12
para eso tenemos un método
00:18:14
contains, si yo lo quiero hacer con contains
00:18:16
porque
00:18:18
imaginaos que yo quiero ver
00:18:18
si
00:18:29
la colección
00:18:30
de pistas que es esta
00:18:35
contiene la lista
00:18:36
imaginaos que yo quiero ver si la colección de pistas
00:18:38
contiene esa pista, que quiero ver eso
00:18:41
con este método
00:18:43
para que en el caso de que no la contenga
00:18:44
por ejemplo, si no la contiene
00:18:47
pues yo quiero a lo mejor decir
00:18:48
no existe esa pista
00:18:53
¿vale? imaginaos que
00:18:56
yo empiezo haciendo esta parte de aquí
00:19:02
ahora os pregunto
00:19:04
¿aquí qué pongo?
00:19:05
para ver si esa pista está o no
00:19:08
¿qué pondría aquí?
00:19:10
el título de la pista
00:19:14
si yo pongo el título de la pista
00:19:15
claro
00:19:21
el compilador se ha quedado
00:19:23
tan ancho
00:19:25
pero llamemos que
00:19:26
me salga un aviso
00:19:29
ese aviso a que se corresponde
00:19:30
ese aviso se corresponde
00:19:36
a que pistas es una colección
00:19:38
no es de cadenas
00:19:40
no es de títulos
00:19:41
pistas es una colección de objetos pista
00:19:43
entonces al contains le tengo que pasar
00:19:46
un objeto pista
00:19:48
A Contains hay que pasarle un objeto pista
00:19:49
Para que él me diga si está en esta colección
00:19:52
Y yo le he pasado una cadena
00:19:54
Entonces él me dice, tú pásame lo que quieras
00:19:55
Pero es que yo te voy a decir que no
00:19:58
Porque una cadena no va a estar
00:19:59
En un conjunto de objetos pista
00:20:01
Tú pásame una pista y ya está
00:20:04
Con lo cual una cadena
00:20:06
No le podemos pasar
00:20:07
Vale, pues entonces, ¿qué le pasamos?
00:20:09
Le tenemos que pasar un objeto pista
00:20:11
¿Qué le pasaríais?
00:20:12
Con el título, pero sea creando un igual
00:20:16
Y eso es lo difícil
00:20:18
Efectivamente
00:20:19
aquí el problema que nos falta es
00:20:21
vale, yo tengo que ver si esta
00:20:23
pista está, para la cual
00:20:25
solo dejo el título, entonces yo automáticamente
00:20:27
me hace volver a algo
00:20:29
que hemos pasado por alto cuando he
00:20:31
hecho estas clases y es, vamos a ver
00:20:33
aquí hay algo que identifique
00:20:35
de forma única las pistas
00:20:37
porque si lo hay
00:20:39
dejémoslo ya
00:20:40
dejémoslo ya reflejado
00:20:42
aquí, pues sí
00:20:45
cada pista se caracteriza por un título
00:20:47
la duración no
00:20:49
porque puede haber diferentes
00:20:52
pistas del CD con la misma duración
00:20:54
con la misma, luego duración no caracteriza
00:20:56
de forma única las pistas
00:20:58
pero título sí
00:20:59
entonces conviene
00:21:01
que yo incorpore el método
00:21:04
equals para que me diga, oye
00:21:05
pistas de igual título son iguales
00:21:07
¿vale? eso para empezar
00:21:10
bueno, pues entonces aquí
00:21:11
yo me puedo hacer
00:21:13
mi equals con título
00:21:19
vale
00:21:22
yo tengo entonces aquí ya hecho mi criterio
00:21:25
de igualdad que me dice
00:21:30
si una pista tiene el mismo título
00:21:31
que otra, a todos los efectos
00:21:34
para la aplicación son la misma
00:21:36
bueno
00:21:38
entonces ahora vuelvo aquí
00:21:43
ahora vuelvo a
00:21:45
donde estaba
00:21:48
en CD
00:21:49
si aquí estaba
00:21:53
aquí, vale
00:21:55
entonces aquí hemos dicho
00:21:56
vamos a pasarle un objeto pista con ese título
00:21:59
un objeto pista con ese título
00:22:01
y entonces
00:22:04
con taste me va a decir a ver si hay
00:22:06
alguno igual que
00:22:08
este objeto pista con ese título en la colección
00:22:10
entonces como
00:22:12
la igualdad viene por el título
00:22:14
me da igual que este objeto pista no tenga
00:22:16
duración puesta o tenga la duración que a mi me dé la gana
00:22:18
vale
00:22:20
entonces
00:22:22
como yo no he puesto constructores
00:22:23
lo tengo que hacer con getDiset
00:22:26
pues vamos a
00:22:28
hacer una pista por aquí
00:22:30
y ahora
00:22:32
p.set título
00:22:34
este, vale
00:22:37
esto ya tiene más sentido porque
00:22:44
yo le paso una pista con un título y
00:22:46
contains ya sabemos que lo que hace es
00:22:47
buscar si hay alguna
00:22:49
pista en este conjunto
00:22:51
igual a esta
00:22:53
y para ver si es igual
00:22:54
el criterio de igualdad que hemos fijado es el título
00:22:57
por eso solo he fijado el título
00:23:00
la duración me da igual porque la va a ignorar
00:23:01
el contains va a ignorar la dirección
00:23:03
vale, entonces con esto
00:23:05
ya lo tendríamos
00:23:08
ya lo encontraría, con test ya funcionaría
00:23:09
aquí lo que no se nos puede
00:23:12
olvidar es, oye, que tipo
00:23:17
de colección es esta
00:23:19
no tienes que poner
00:23:20
pero si ya la tengo
00:23:21
claro, pero es que yo no tengo
00:23:26
como no he hecho constructor con parámetros
00:23:32
por eso lo he hecho fuera, por vaguería
00:23:34
no he hecho constructor, pero vamos, es igual
00:23:36
es lo mismo, vale, entonces
00:23:38
aquí, claro
00:23:40
que no se nos tiene que olvidar nunca
00:23:43
el pensar, a ver, espérate
00:23:45
¿con qué tipo
00:23:47
de colección estás trabajando?
00:23:49
porque en función del tipo de colección
00:23:51
con el que estás trabajando
00:23:53
los métodos de esa colección
00:23:54
verifican la igualdad de una manera
00:23:57
o de otra
00:24:01
las listas, sea linked list o array list
00:24:01
ya sabemos que verifican la igualdad
00:24:04
con el equals y ya está
00:24:07
pero esto no es una lista
00:24:08
pistas no es una lista
00:24:11
pistas es un
00:24:13
haset
00:24:15
¿no?
00:24:15
luego como pistas es un haset
00:24:18
los métodos de pistas
00:24:20
el contains, el remove, etc
00:24:23
cuando tienen que ver si un objeto
00:24:25
es igual a otro
00:24:27
no usan solo el equals, ¿qué más usan?
00:24:27
el hashCode
00:24:33
usaban primero el Haskell y luego el Equals
00:24:33
y yo en pista
00:24:36
no he hecho el Haskell, he hecho el Equals solo
00:24:38
entonces si esto fuera
00:24:40
una lista, si esto fuera
00:24:42
un list, ya está, no tengo más que hacer
00:24:44
si esto fuera un list, no tengo más que hacer
00:24:46
porque el
00:24:48
contains de aquí
00:24:50
va a ir aplicando el Equals
00:24:52
de este con todos y cada
00:24:54
uno de los de aquí, va a ir aplicando el Equals
00:24:56
en cuanto encuentra una que el Equals le da true
00:24:58
ya está, magnífico
00:25:00
Pero pistas no son list, pistas es un hash set, con lo cual el contains de ese hash set, donde estoy, el contains de hash set es diferente del contains de list, es distinto, este es el contains de hash set, ¿por qué eso es un hash set?
00:25:02
pues el context de hashSet lo que hace es
00:25:23
coge este objeto y va
00:25:25
uno por uno haciendo hashCode
00:25:27
igual, hashCode equals, porque así es como vimos que
00:25:29
funcionaba, así es como vimos que funcionaba
00:25:31
y cuando encuentra uno
00:25:33
en el cual la secuencia de
00:25:35
hashCode equals le da true, entonces
00:25:37
dice, ah pues está, claro pero
00:25:39
entonces tengo que hacer el hashCode
00:25:41
porque si no lo hago, ya sabéis que esto que
00:25:42
le pasa, entonces el hashCode solo da true
00:25:45
si son el mismo objeto
00:25:47
la misma dirección de memoria, uno encima del otro
00:25:48
¿vale?
00:25:50
Claro, pues entonces aquí nunca me va a encontrar esta pista, aquí nunca, aunque el título sea igual,
00:25:53
aunque el título sea igual, nunca me la va a encontrar si yo no pongo aquí el hashCode, si no lo pongo.
00:25:59
Ahora ya sí, ¿vale? Ahora ya sí, ¿vale?
00:26:05
Entonces, repitiendo, como este objeto es un hashSet, la clase a la que van a pertenecer los objetos que la forman,
00:26:16
La clase a la que van a pertenecer tienen que ofrecer
00:26:28
cómo van a implementar el hashCode y el equals, los dos.
00:26:32
Porque la clase hashSet usa los dos.
00:26:36
¿Y cómo lo van a implementar?
00:26:41
Pues yo decido en función de qué parámetro, de qué propiedad les interesa.
00:26:42
Y va a ser de la propiedad o las propiedades que lo identifiquen de forma única.
00:26:47
A ver, podríamos haber decidido que a cada pista del CD se caracterice por ambas.
00:26:52
Es decir, pistas del mismo título pueden ser distintas si su duración es distinta
00:26:58
Podría ser otras situaciones, que eso ya depende de cuál sea mi situación real
00:27:06
Yo tengo que describir mi situación real
00:27:10
Pues tu situación real es que pistas del mismo nombre son la misma
00:27:12
Pues ya está, esto es lo único que forma parte del jasco de equals
00:27:16
Pero tu situación podría ser, no, no, no
00:27:20
Dos pistas pueden llamarse igual, pero son distintas si la duración es distinta
00:27:22
si tu situación es esa
00:27:26
que eso depende de la situación real
00:27:28
que tienes que analizar, claro, situación es esa
00:27:31
pues entonces el
00:27:33
jasco de equals será distinto
00:27:34
el jasco de equals implicará a los dos
00:27:36
y lo generaremos de forma distinta, claro
00:27:38
implicando a los dos
00:27:40
y si a uno se le olvida
00:27:41
y no hace jasco de equals
00:27:44
y no los pone ahí, pues ¿qué está pasando?
00:27:47
lo que ya hemos hecho mil veces
00:27:49
¿significa eso que la clase pista no tiene
00:27:50
jasco de equals? claro que lo tiene
00:27:52
tiene el heredado de object
00:27:54
porque para eso pista hereda de object
00:27:55
como todas las clases del mundo
00:27:58
entonces si yo no lo sobrescribo
00:27:59
si no lo sobrescribo
00:28:01
usa el de object
00:28:03
y el hascode de equals
00:28:05
de object
00:28:07
y el equals de object ya sabemos lo que hace
00:28:08
solamente detecta igualdad
00:28:11
si los objetos
00:28:14
están apuntados por la misma
00:28:15
y están encima del otro
00:28:17
es decir, nunca van a detectar
00:28:19
igualdad dos pistas del mismo título
00:28:22
si no son
00:28:24
un objeto apuntado por la misma
00:28:26
dirección de memoria
00:28:28
es decir, yo aquí le puedo pasar
00:28:29
una pista con el mismo
00:28:31
título y la misma duración que cualquiera
00:28:34
de estas, una que me he creado con
00:28:36
mismo título, misma duración
00:28:38
y el context nunca me va a dar plus
00:28:39
porque este objeto no va a tener
00:28:42
la misma dirección de memoria que esto, no va a tenerlo
00:28:44
y el jasco de equals de object
00:28:46
exigen que
00:28:48
la dirección de memoria sea la misma
00:28:50
para dar igual
00:28:52
Luego para que la aplicación funcione
00:28:52
Con sentido y sus resultados tengan sentido
00:28:56
Sus resultados tengan sentido
00:28:58
Pues tengo que decidir esta implementación
00:28:59
Tengo que decidirla
00:29:02
Bueno pues entonces
00:29:03
Estábamos con nuestro método reproducir
00:29:07
Que pedía una pista y lo primero que hemos hecho es
00:29:10
Ver si no la contiene
00:29:13
No existe
00:29:15
Y podríamos aprovechar ya y salir
00:29:16
De
00:29:19
Del
00:29:19
Método con el retun
00:29:24
¿verdad? podríamos aprovechar
00:29:28
ya salir con el return
00:29:30
y ahora en el caso
00:29:31
de que la contenga
00:29:34
pues vamos a
00:29:35
parar, esto es por hacer la tontería
00:29:37
parar el
00:29:40
programa, dejarlo detenido
00:29:42
el tiempo que dure
00:29:43
la pista
00:29:44
y uno puede parar siempre
00:29:47
un programa
00:29:49
si le da la gana
00:29:51
dejarlo ahí pausado, así
00:29:53
con esto
00:29:55
pone aquí los milisegundos
00:29:57
por ejemplo
00:30:00
esto dejaría parado
00:30:02
lo que pasa es que tengo que propagar la excepción
00:30:03
y ya está
00:30:06
y entonces
00:30:07
no, porque esto tendría que cambiar la interfaz
00:30:10
nada, esto solamente
00:30:14
pues porque haga algo distinto
00:30:22
esta sentencia
00:30:23
sleep lo que hace es
00:30:26
deja el programa pausado
00:30:27
ahí parado, tantos milisegundos
00:30:29
como tú le digas
00:30:32
entonces
00:30:33
vale, en nuestro caso
00:30:35
serán los milisegundos que
00:30:37
dure la pista
00:30:39
bueno, pues entonces, ahora
00:30:40
¿qué tendríamos que
00:30:43
hacer ahora? bueno, la pista existe
00:30:46
ahora ya tenemos que dejar el programa
00:30:47
parado con esta sentencia
00:30:49
tantos milisegundos
00:30:51
como me diga la duración de la pista
00:30:53
bueno, pues ¿qué es lo siguiente que haríais ahora?
00:30:55
en este método
00:30:58
ya sabemos que
00:31:00
la pista existe
00:31:01
hay que localizar la duración de esa pista
00:31:02
¿no? pues que es lo siguiente que haríamos
00:31:05
¿eh?
00:31:06
que es lo siguiente que haríamos ahora ya
00:31:09
para completar este método
00:31:11
venga, conectaros, ¿en qué estáis pensando?
00:31:12
a ver, la pista
00:31:20
ya existe y ahora ya
00:31:21
tenemos que localizar la pista
00:31:23
para parar el programa todo el tiempo
00:31:25
que dure, bueno, pues que es lo siguiente que haríais
00:31:27
¿eh?
00:31:29
que es lo de try-catch
00:31:30
esto nada
00:31:32
olvídate, ya lo mencionamos cuando
00:31:34
hicimos la clase teclado, dijimos ya cuando
00:31:36
veamos excepciones
00:31:38
ya lo haremos, ¿vale?
00:31:40
que significa, intenta hacer esta sentencia
00:31:42
y si no lo consigues, haz esto
00:31:44
pero ya lo veremos en detalle cuando
00:31:45
lo que pasa es que para llamar a este
00:31:48
método tan tonto, que es un método que
00:31:50
deja el programa parado, es obligatorio
00:31:52
hacer el try card, por eso lo puse
00:31:54
pero olvidaos del try card
00:31:56
me da igual
00:31:59
ahora pregunto, ahora que es lo siguiente
00:31:59
que haríais, que programaríais
00:32:03
para conseguir esto que digo
00:32:04
que es encontrar la duración
00:32:06
de la pista para dejar parada
00:32:09
el programa
00:32:10
bueno, recorrer
00:32:12
la colección es lo que estoy esperando que me digáis
00:32:16
lo siguiente que haríais, recorrer la colección hasta encontrar
00:32:18
esa pista
00:32:20
si
00:32:21
te refieres para evitar
00:32:27
el content de arriba, claro
00:32:30
pero es que yo lo he separado por partes para revisar
00:32:32
el content arriba, vale
00:32:34
yo lo que me interesaba era
00:32:36
Con lo de arriba
00:32:37
Que os refrescaréis el contains
00:32:39
Y el hasset, el equals y todo eso
00:32:42
Vale, bueno pues ahora
00:32:44
Vamos a recorrer la colección
00:32:46
Vamos a recorrerla
00:32:47
Hasta encontrar la pista
00:32:49
Para cada pista p
00:32:51
En las pistas estas
00:32:54
Pues que podemos hacer
00:32:56
Pues si esta es la que tengo que reproducir
00:32:59
Si p.get
00:33:01
Título
00:33:04
Resulta que es
00:33:05
igual que la pista que estoy
00:33:08
buscando, pues ala, ya está
00:33:09
ya puedo
00:33:11
hacer esta sentencia de aquí
00:33:12
y hago esta sentencia, pasándole
00:33:15
¿qué? pues pasándole
00:33:21
p.getDuración
00:33:23
y listo
00:33:26
y ya está
00:33:28
esta llave cierra esto
00:33:29
y me
00:33:31
falta la llave del forEach
00:33:33
que
00:33:35
estaría ahí
00:33:37
y p es que ya la tengo
00:33:38
usada
00:33:40
y esto es pista
00:33:44
pista, ahí, vale
00:34:01
bueno, pues entonces
00:34:04
este método pide la pista
00:34:07
primero
00:34:11
mira a ver si está o no está
00:34:12
mira a ver si está o no está, si no está afuera
00:34:14
y luego ya si hemos llegado
00:34:16
a este punto es porque ya está
00:34:18
y cuando la encuentra
00:34:20
pues deja el programa parado lo que dure la pista
00:34:23
y se acabó, pero vamos
00:34:26
esto por poner algo
00:34:27
podríamos haber puesto reproduciendo pista
00:34:29
que dura no sé cuántos, me da igual
00:34:31
vale, pues ya tenemos el CD
00:34:33
y el vinilo con sus propiedades
00:34:43
implementando
00:34:45
reproducir cada uno de ellos
00:34:47
vale, vamos a hacer un main
00:34:49
que haga cosas con
00:34:54
estos discos, esto ya
00:34:57
no se parece en nada
00:34:58
vamos a hacer un main aquí
00:34:59
vale
00:35:08
y aquí como métodos para luego
00:35:37
llamar desde el mini y quedemos organizados
00:35:38
aquí nos podemos plantear
00:35:40
algunas funcionalidades que nos pueda interesar hacer
00:35:41
con esta estructura de clases
00:35:44
que ahora mismo son cinco
00:35:49
discoteca, disco, vinilo, CD y pista
00:35:52
son las cinco entidades de nuestro modelo de datos
00:35:54
discoteca que tiene un list de discos
00:35:57
la clase disco es una interfaz
00:36:00
que a su vez tiene un vinilo y CD
00:36:03
que se reproducen de forma distinta cada uno
00:36:04
y luego cd que a su vez tiene pistas
00:36:09
y cd para
00:36:11
reproducirla, para reproducirse
00:36:13
ha necesitado efectivamente acceder
00:36:16
a las pistas que tiene
00:36:18
y luego un main
00:36:19
que es el main que va a hacer cosas con estas cosas
00:36:21
vale, vamos a parar unos minutejos
00:36:23
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 3 de abril de 2024 - 18:33
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 27″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 178.64 MBytes