20260120 Herencia_Ejer_ABSTRACT_2 - 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 seguimos. Pues nada, esta clase se nos ha convertido en abstracta. Repito, ¿es grave que sea abstracta? Hombre, vale, ¿es grave que sea abstracta? ¿No se van a poder crear objetos figura geométrica?
00:00:00
pero seguramente mi aplicación
00:00:25
no lo vaya a usar un objeto
00:00:27
figura geométrica, va a usar un triángulo
00:00:29
un cuadrado, entonces si no va a usar
00:00:31
objeto figura geométrica que es lo habitual
00:00:33
que se abstracta, no es grave
00:00:35
es de hecho lo ideal
00:00:37
¿por qué es lo ideal?
00:00:38
porque ahora todos los que hereden
00:00:41
ahora ya tienen
00:00:44
la orden expresa de
00:00:46
oye tú, ¿qué quieres heredar de mí?
00:00:47
muy bien, pero entonces
00:00:50
sobrescribe este método
00:00:52
a tu manera
00:00:53
Por ejemplo, triángulo
00:00:55
Me ha sido un error de compilación
00:00:58
¿Qué me dice el error?
00:00:59
Perdona, pero triángulo debe implementar el método figura geométrica
00:01:01
Debe implementarlo
00:01:05
¿Vale?
00:01:06
A ver, podría haber otra cosa
00:01:12
¿Qué es?
00:01:14
No, no, no, no quiero implementarlo
00:01:15
No, por nada del mundo
00:01:16
No quiero, que estoy ahora mismo
00:01:17
Haciendo otra cosa y no me apetece
00:01:19
Pero necesito quitar el error de compilación
00:01:21
pues que triángulo
00:01:24
se abstracta también
00:01:27
es decir, pero no
00:01:28
no, porque ya tiene
00:01:34
claro, o sea, aquí
00:01:39
me voy a triángulo
00:01:45
triángulo hereda de la clase abstracta
00:01:46
y por tanto hereda un método abstracto
00:01:49
que está obligada a implementar
00:01:51
pero yo no quiero
00:01:53
implementarla en ese momento porque estoy
00:01:55
haciendo pruebas en otro sitio, pero no quiero
00:01:57
el error de compilación. No lo quiero.
00:01:59
A ver, podría hacer esta
00:02:02
abstracta también. ¿Por qué?
00:02:03
Porque entonces se queda con el método
00:02:05
abstracto.
00:02:07
Esta, al heredar de
00:02:09
figura geométrica, hereda su método abstracto
00:02:11
y al no implementarlo,
00:02:13
porque no me ha dado la gana,
00:02:15
al no implementarlo, la he convertido en abstracto.
00:02:17
Pero, hombre, esto no es lo que queremos
00:02:20
hacer ahora nosotros. Porque nosotros sí
00:02:21
que queremos crear objetos triángulos. Esto ha sido
00:02:23
una solución temporal para quitar el error de
00:02:25
compilación, pero hombre
00:02:27
entonces dejaría mi aplicación
00:02:28
incapaz de crear objetos
00:02:31
triángulos, es que no quiero que
00:02:33
se abstracta triángulo, lógicamente
00:02:35
lo que quiero es
00:02:36
implementar el
00:02:39
método perímetro
00:02:41
que esta de aquí ha dejado
00:02:43
vacío, entonces
00:02:45
estamos tirando mucho de atajos del
00:02:47
entorno de desarrollo, demasiado
00:02:51
pero bueno, quiero
00:02:52
creer que tenéis criterio suficiente como
00:02:55
para usar los atajos bien
00:02:57
y si algo lo genera mal
00:02:59
hacerlo mal, entonces, él me ofrece
00:03:00
aquí
00:03:03
me ofrece aquí
00:03:03
hace el método que está sin implementar
00:03:05
venga, pues, me gusta
00:03:09
este atajo del entorno
00:03:11
y aquí me lo ha puesto, ¿dónde me lo ha puesto?
00:03:12
aquí, me lo ha dejado vacío
00:03:15
y ahora yo ya
00:03:17
le hago el bueno
00:03:19
¿vale? ¿veis? es
00:03:20
método sobrescrito
00:03:23
sobrescrito de la clase de arriba
00:03:24
calcula perímetro del triángulo
00:03:26
pues será lado 1 más lado 2 más lado 3
00:03:29
no hay otra
00:03:31
no hay que ponerlo, no es obligatorio
00:03:31
pero es recomendable
00:03:42
¿por qué es recomendable?
00:03:43
por si te equivocas
00:03:46
calculas perímetro
00:03:47
que te coja el
00:03:48
vale, para validar
00:03:51
para nivel de compilación
00:03:53
validar que realmente ese es
00:03:55
el de arriba y no otro nuevo que estoy
00:03:57
haciendo. Si no ponemos
00:03:59
a novel write, no estamos a nivel de
00:04:01
compilación validando.
00:04:03
¿Vale? A este ya le tengo. Triángulo
00:04:05
se quedó estupendo.
00:04:07
Entonces,
00:04:09
realmente el diseño con clases
00:04:10
abstractas y suprima
00:04:13
que suprima es luego
00:04:15
la más usada
00:04:17
y suprima las interfaces
00:04:19
es fundamental
00:04:21
porque te da un patrón de comportamiento.
00:04:22
¿Vale?
00:04:27
Es decir, en figura geométrica, todo lo que yo ponga aquí abstracto, estoy obligando a los que vienen detrás de mí a que lo hagan.
00:04:27
Entonces, oye, tú puedes ser figura geométrica si te da la gana.
00:04:37
Pero si tú quieres ser figura geométrica, perdona, pero dime cómo calculas el perímetro.
00:04:41
Si no, no seas figura geométrica.
00:04:46
Entonces, impones unas plantillas de comportamiento.
00:04:49
¿Vale? Luego tiene todo el sentido como diseño.
00:04:53
Pues cuadrado le pasa lo mismo
00:04:55
Cuadrado al heredar de figura geométrica
00:04:58
Tiene que implementar el método abstracto
00:05:02
Y en este caso será 4 por la A2
00:05:04
Y círculo lo mismo
00:05:10
Tiene que implementar el método de la clase que hereda
00:05:20
Que está sin implementar
00:05:25
Y en este caso este será
00:05:27
2 por pi
00:05:31
que es una variable estática
00:05:35
de la clase math que me da la máquina virtual
00:05:38
2 por pi por el radio
00:05:40
vale, entonces
00:05:44
fijaos que diferencia grande
00:06:11
repito otra vez, entre hacerlo abstracto
00:06:15
y dejarlo vacío y que no sea abstracto
00:06:18
si yo lo dejo vacío y no lo dejo como abstracto
00:06:21
con lo cual aquí quito el abstract
00:06:27
y aquí pongo
00:06:29
pues esto
00:06:33
vale
00:06:35
pues esto también funciona
00:06:36
y ahora triángulo
00:06:39
está sobrescribiendo el calcula
00:06:43
perímetro de arriba, también lo está sobrescribiendo
00:06:45
y ya está y todo está bien
00:06:47
pero esto es peligroso
00:06:49
porque ahora meto octógono
00:06:50
y octógono
00:06:53
no tiene por qué sobrescribir
00:06:55
calcula perímetro, no tiene por qué
00:06:57
porque como este no es abstracto
00:06:59
no obligas a sobreescribirlo
00:07:01
con lo cual octógono se podría estar quedando
00:07:02
con este retuncero que no nos gusta
00:07:05
entonces esto es más peligroso
00:07:07
es mucho mejor
00:07:10
por tanto
00:07:11
dejarlo como lo teníamos
00:07:12
clase abstracta
00:07:15
y método abstracto
00:07:16
para que cualquiera que entre a jugar aquí
00:07:18
como figura geométrica
00:07:21
tenga que implementar esto por huevos
00:07:22
vale pues ahora ya si
00:07:25
mi método
00:07:28
perímetro total
00:07:31
se queda limpio y magnífico
00:07:32
y estupendo
00:07:34
se queda muy limpito
00:07:35
yo recorro todas mis figuras
00:07:38
cada figura llama calcula perímetro
00:07:40
y a qué versión
00:07:43
de calcula perímetro llamará
00:07:44
ya sabemos cómo funciona esto
00:07:46
que en tiempo de ejecución
00:07:48
lo que la máquina virtual busca
00:07:50
es el método
00:07:52
en la versión en la que este
00:07:53
se implementó, no en la que se
00:07:56
declaró. Declarado está como
00:07:58
figura geométrica, ya lo sabemos.
00:08:00
Pero a la hora de ejecutar el método
00:08:03
el que se ejecuta, es tal cual
00:08:04
tú te implementaras, tú te crearas.
00:08:06
¿O no lo has creado?
00:08:09
¿Vale? Y ese es
00:08:12
el polimorfismo del que hemos hablado.
00:08:12
Pues perímetro total aquí
00:08:15
queda tan limpio y tan estupendo.
00:08:16
Gracias a este método calcula perímetro
00:08:18
que está en figura geométrica
00:08:20
abarcándolo todo.
00:08:22
¿Entendido, no?
00:08:28
A ver, ¿qué más tenía que hacer este ejercicio?
00:08:30
Manejador figuras, vale.
00:08:35
Vamos a hacer un manejador cuadrados, que es más específico que manejador figuras,
00:08:38
porque va a manejar solo cuadrados.
00:08:43
Pues venga, vamos a hacer manejador cuadrados, que hereda de manejador figuras.
00:08:47
Pues venga, dos relaciones de herencia, dos jerarquías distintas,
00:08:54
una la de las figuras y otra la de los manejadores.
00:08:58
dos jerarquías distintas
00:09:01
manejador de cuadrados
00:09:03
este es para manejar
00:09:09
cuadrados específicamente
00:09:11
el manejador figuras es para manejar
00:09:12
figuras de diferentes tipos
00:09:14
este es para manejar cuadrados
00:09:16
específicamente
00:09:19
vale, que nos dicen que tiene que tener
00:09:20
añada un método
00:09:23
para calcular el área total
00:09:27
de todos los cuadrados
00:09:29
del array
00:09:31
a ver, esto yo lo veo un poco feo
00:09:32
pero bueno
00:09:35
Cuando instanciamos un manejador cuadrados, él tiene su array de figuras geométricas y que hereda este de aquí, más su método,
00:09:36
pero este además tiene un método para calcular el área de todos los cuadrados.
00:10:01
vale, entonces
00:10:08
este public
00:10:10
novel
00:10:13
área
00:10:18
total
00:10:19
vale, entonces
00:10:23
a ver, un momentito
00:10:27
vale, pues en principio
00:10:35
la idea, lo que yo interpretaría
00:10:38
de esto es
00:10:39
que cuando tu instancia es un manejador
00:10:40
cuadrados
00:10:43
lo que vas a meter en su array de figuras
00:10:44
son cuadrados, lógicamente
00:10:47
vale
00:10:49
entonces, aquí no hace falta
00:10:50
que distingamos por instance of
00:10:53
si todos los objetos del array
00:10:55
son cuadrados o no, les podemos hacer el casting
00:10:57
sin más, a ver, me explico
00:10:59
y ahora vamos a recorrer
00:11:01
su array
00:11:10
for, a ver, manejador figuras
00:11:10
vamos a
00:11:14
manejador figuras y vamos a ponerle
00:11:16
este array
00:11:18
ah, no lo tenía ni private ni nada
00:11:19
vamos a ponerle
00:11:21
no lo habíamos hecho
00:11:23
ni un get ni un set, vamos a ponerle como protected
00:11:27
y un get y un set para el array este, que no se lo habíamos hecho
00:11:31
no habíamos hecho get y set para esa propiedad
00:11:35
vámonos otra vez a manejador de cuadrados y ahora ya
00:11:38
para cada figura geométrica
00:11:52
figura en su array de figuras
00:12:03
¿qué vamos a hacer? podemos
00:12:08
instanciar
00:12:20
vale, podemos llamar figura geométrica
00:12:23
lo mismo con el área
00:12:27
podemos hacer
00:12:30
suma
00:12:32
más
00:12:35
igual
00:12:37
figura
00:12:37
calcula área
00:12:40
claro, pero es que
00:12:46
el manejador cuadrados cuando tú lo instancies
00:12:52
la idea es que
00:12:55
solo tenga cuadrados en su array
00:12:56
porque si no habrías hecho un manejador de figuras
00:12:58
entonces como solamente
00:13:00
va a tomar cuadrados en su array
00:13:02
luego ya vamos a hacer
00:13:04
en el main, vamos a validarlo para que solo tenga
00:13:06
cuadrados, pero es el único sentido que tiene
00:13:08
manejador cuadrados que en su array solo haya cuadrados
00:13:10
es el único sentido que tiene
00:13:12
que exista esta clase
00:13:14
pero no es
00:13:15
el método no sería
00:13:16
que hiciera eso
00:13:18
Claro, el array suyo
00:13:21
Él tiene dentro su array
00:13:27
Que es este
00:13:29
Su array
00:13:29
Manejador, ¿dónde estamos?
00:13:31
Este
00:13:35
No, es que es el suyo propio
00:13:35
Es decir, no es que haya
00:13:44
Un conjunto de figuras
00:13:47
Y manejador
00:13:49
Es que igual te estás confundiendo con dos cosas
00:13:50
no es que en el main
00:13:53
ahora cuando hagamos el main se va a entender mejor
00:13:54
no es que en el main haya un conjunto de figuras
00:13:56
y manejador figuras acceda a todas
00:13:58
manejador cuadrados
00:14:01
solo a los cuadrados
00:14:03
no, o sea, manejador figuras
00:14:04
tiene sus figuras, que serán de cualquier tipo
00:14:06
que luego hay un manejador cuadrados
00:14:08
ese es para manejar solo cuadrados
00:14:11
y tendrá su propio array
00:14:12
pero que en ese array solo habrá cuadrados
00:14:14
¿vale? pues este objeto
00:14:16
manejador cuadrados tiene aquí su array
00:14:19
que es este
00:14:20
Perdón, que es este
00:14:22
Tiene su array
00:14:24
Y en ese array solo va a haber cuadrados
00:14:24
¿Vale? Entonces
00:14:28
Este de aquí
00:14:30
Ahora en el main lo vamos a entender mejor
00:14:33
Vale
00:14:36
Este de aquí
00:14:38
¿Por qué me dice esto?
00:14:39
Ah, jolines, muy bien
00:14:43
Estáis muy despiertos
00:14:45
Manejador
00:14:47
Manejador
00:14:49
Figuras
00:14:51
vale, vale, entonces
00:14:53
podemos
00:15:00
sacar
00:15:03
bueno, vamos a hacerlo como dice aquí
00:15:06
con calcular
00:15:12
área nos pasa lo mismo
00:15:15
si tuviéramos aquí un método
00:15:16
para calcular el área de cualquier figura
00:15:18
estupendo, pues podemos hacer
00:15:20
lo mismo, igual que hemos hecho aquí
00:15:22
un abstracto de calcular
00:15:24
perímetro, vamos a
00:15:26
hacer un abstracto de calcular área
00:15:28
en figura, exactamente igual
00:15:30
vamos a hacernos un abstracto
00:15:32
calcula
00:15:37
área
00:15:42
entonces esta clase abstracta
00:15:43
tiene dos métodos abstractos, puedes tener
00:15:46
uno, dos, mil, con que tenga
00:15:48
al menos uno ya se convierte en abstracta
00:15:50
vale
00:15:52
tiene dos
00:15:54
entonces ahora, triángulo, cuadrado y círculo
00:15:55
otra vez le sale error de compilación
00:15:58
porque una clase
00:16:00
que hereda de una abstracta, tiene que sobreescribirlo
00:16:02
todo, todo, no hay
00:16:04
tutía
00:16:06
pues venga, vámonos una por una
00:16:07
triángulo, vamos a sobreescribir
00:16:10
su método
00:16:13
calcula área
00:16:14
calcula área de triángulo
00:16:15
pues calcula área de triángulo
00:16:21
buf, tenemos que
00:16:24
sacar la base por la altura de los tres lados
00:16:26
pero esto será una fórmula
00:16:28
a través de los lados será fácil de hacer
00:16:29
hay una fórmula que seguro
00:16:31
que echa GPT-SAN
00:16:34
Vale, a ver
00:16:35
Área del
00:16:39
Triángulo
00:16:42
Sabiendo los lados
00:16:44
Venga
00:16:49
Ah, la fórmula de Herón
00:16:51
Esta famosa
00:16:56
Joder, pues sí que es larga la tía
00:16:57
Pero bueno, vamos a hacerla
00:16:59
Calculas el semiperímetro
00:17:00
Y luego la raíz de todo esto
00:17:03
Vale, pues venga
00:17:05
Vamos a pasar esto
00:17:07
Bueno, es que somos tan vagos
00:17:09
A ver si me entiende así
00:17:14
Lado 1, lado 2, lado 3
00:17:16
Variables
00:17:19
Java, dame código
00:17:21
Y no tenemos ni que pasarlo
00:17:22
Vale
00:17:27
Este es el semiperímetro
00:17:36
Y esta es la raíz de lo que faltaba
00:17:38
Ala, ya lo tenemos
00:17:41
Vale
00:17:42
Semiperímetro
00:17:53
La suma de los lados entre 2
00:17:55
Y la fórmula de erón, la raíz de todo esto
00:17:58
Esta es la fórmula de erón
00:18:01
Y ahora ya retun
00:18:04
Le paso esto al retun directamente y listo
00:18:07
Retun, todo esto
00:18:11
¡Hala! Ya tengo el área del triángulo
00:18:15
No hace falta copiarla de aquí porque si la estáis pidiendo echa GPT también
00:18:20
O sea, me refiero, o la estáis copiando de aquí
00:18:26
Bueno, pues
00:18:28
Voy a bajar aquí abajo
00:18:32
Para que se vea mejor
00:18:37
Vale, pues hay que saber
00:18:41
Cuando no hacer el trabajo sucio
00:19:05
Pero claro
00:19:07
El trabajo sucio
00:19:09
Es el que no nos ayuda a aprender
00:19:12
El que nos ayuda a aprender
00:19:14
No es el trabajo sucio
00:19:16
Ese sí que tenemos que hacerlo
00:19:17
En ese proceso estáis vosotros
00:19:18
Bueno, pues venga
00:19:20
Aquí tenemos el área de este de aquí
00:19:22
Ahora, en el cuadrado lo tenemos más fácil, afortunadamente
00:19:28
En el cuadrado, el área del cuadrado es lado por lado
00:19:32
Y el área del círculo también lo tenemos muy fácil
00:19:45
El área del círculo también lo tenemos muy fácil
00:19:51
porque será
00:19:57
pi
00:20:01
por radio
00:20:04
por radio
00:20:09
y ahora ya el manejador
00:20:11
de cuadrados
00:20:21
pues calculará el área total
00:20:21
de todos los cuadrados que tienen
00:20:26
su array
00:20:28
que se supone que son todos los del array
00:20:29
aunque no me gusta a mi mucho
00:20:32
este enunciado como está explicado
00:20:34
a ver
00:20:36
vale, manejador círculo
00:20:36
sería igual
00:20:49
igual, así que el manejador círculo
00:20:49
lo dejamos, vamos a hacer el main
00:20:52
un main probando esto, el main vamos a
00:20:54
tunearlo un poco
00:20:56
manejador figuras
00:20:57
en lugar de decir, vamos a decir cuadrado
00:21:00
pues, vale
00:21:08
bueno, vamos a hacer un main, nosotros
00:21:12
un poco tuneado, para
00:21:14
ejemplificar un poco
00:21:16
todo el ejercicio, pasamos un poco
00:21:18
del main ese de ahí
00:21:20
venga, pues nuestro main
00:21:21
a ver que se me da la
00:21:24
la batería
00:21:39
vale, pues vamos a pasar nosotros de ese main
00:21:41
para hacer algo un poquito así más
00:21:46
más completo, que nos lo
00:21:47
muestre un poquito mejor
00:21:50
venga, pues vamos a crear
00:21:52
un array de figuras geométricas
00:21:54
para luego mandárselas a un manejador
00:21:56
que las maneje
00:21:58
entonces vamos a crear primero un array de figura
00:21:59
geométrica
00:22:02
inicialmente
00:22:13
cero, y ahora vamos a hacer un bucle
00:22:34
En el que esté metiendo figuras
00:22:36
Dándole a elegir entre las tres
00:22:38
Hasta que el tío diga fin
00:22:39
¿Vale?
00:22:41
Vale, pues entonces
00:22:47
Podemos hacer
00:22:48
Figuras cométricas
00:22:50
No debería ser un manejador de figuras
00:23:02
Cuando tenga el array
00:23:04
Porque manejador de figuras
00:23:07
Necesita el array
00:23:09
Para manejarlas
00:23:10
Voy a crear primero el array
00:23:11
¿Vale?
00:23:13
Vale
00:23:15
Voy a llamar a esto lectura, sea diferente de fin, vaya diferente de fin, vale, entonces primero vamos a leer, le decimos crear figura, fin para terminar,
00:23:16
Y ahora le podemos poner aquí, para orientarle, triángulo, cuadrado o círculo.
00:24:31
Ahora, aquí leeríamos, yo voy a meter el teclado ese para no estar con el escáner,
00:24:49
que es un rollo de leer como queráis.
00:25:02
¿El hard lo tienes?
00:25:31
Sí.
00:25:36
Vale, pues si tienes ya el hard
00:25:36
Botón derecho en el proyecto
00:25:39
Buildpad
00:25:41
Configure Buildpad
00:25:41
Ahora una vez aquí
00:25:43
Pinchas Clashpad
00:25:46
Add external hash
00:25:48
Y aquí ya seleccionas el hard
00:25:50
Y ya lo tienes
00:25:53
¿Vale?
00:25:54
Sí, botón derecho
00:25:56
Buildpad
00:25:59
Configure Buildpad
00:26:01
Pinchas en Clashpad
00:26:03
Pues no estamos usando módulos
00:26:06
el módulo de path habría que declararlo
00:26:07
en el módulo de info y es un rollo, class path
00:26:09
add external hash
00:26:11
y ya coges esa clase
00:26:13
y ya está
00:26:16
y cuando ya la has cogido os aparecerá
00:26:18
aquí en references libraries
00:26:22
os aparecerá ya la clase
00:26:24
con el nombre
00:26:26
para que podáis llamarlo
00:26:27
vale, pues entonces
00:26:29
ahora, una vez que ha leído
00:26:42
esto, aquí habría un switch case
00:26:45
y todo eso, pero vamos
00:26:47
a aprovechar que me lo dijisteis
00:26:49
ayer, pues
00:26:51
este sería un caso de
00:26:53
en un posible.
00:26:54
Y es, vamos a ver,
00:26:57
solo hay
00:27:00
tres tipos posibles de figura.
00:27:01
Mi tipo de figura solamente
00:27:03
puede ser o triángulo, o
00:27:05
cuadrado, o círculo. Solo tengo tres tipos
00:27:07
posibles de figura.
00:27:09
Pues, ¿por qué no me creo
00:27:11
un tipo más concreto
00:27:13
que el string? Porque en string cabe cualquier
00:27:15
cosa. Entonces,
00:27:17
¿por qué no me creo un tipo que solo admita
00:27:19
tres posibilidades?
00:27:21
triángulo, cuadrado, círculo
00:27:24
tres ideas ¿vale?
00:27:25
esos son los tipos enumerados
00:27:27
un tipo enumerado
00:27:29
es un tipo que tiene
00:27:31
un conjunto finito de valores
00:27:33
los tipos que hemos visto
00:27:35
hasta ahora, el string, el int, el double
00:27:37
tiene infinito
00:27:40
a ver, infinitos no, porque con int
00:27:41
solamente puedes representar hasta 2 elevado a
00:27:43
31 o más menos, pero
00:27:45
muy grande ¿vale?
00:27:47
Entonces, indouble, float, es una posibilidad enorme de valores, ¿vale?
00:27:49
Pero hay veces que yo tengo una variable que solo se mueve entre tres posibilidades.
00:27:57
Por ejemplo, tengo tres aulas, dam1, dam2 y dam3.
00:28:04
Pues a lo mejor me apetecería crear un tipo de dato que solo tenga tres posibles valores,
00:28:08
dam1, dam2 y dam3, ya está, tres posibles valores.
00:28:13
me apetecería crearlo
00:28:16
y ahora ya poder crear variables
00:28:18
de ese tipo y esas variables voy a tener
00:28:20
la garantía, la seguridad
00:28:22
de que solo van a tener esos
00:28:24
tres posibles valores, solo esos tres
00:28:26
entonces bueno, eso puede
00:28:28
hacer el diseño más bonito
00:28:30
más claro
00:28:31
para el que lo ve, porque si tú ves que algo
00:28:34
es de ese tipo, ya sabes que
00:28:36
solamente va a ser una de esas tres cosas
00:28:38
me obliga luego a seguir
00:28:40
programando en coherencia con eso
00:28:42
bueno, es otra herramienta
00:28:44
más, no es que las cosas
00:28:46
se tengan que hacer de una manera o tengan
00:28:48
que hacer de otra, tal cual
00:28:50
no, nosotros
00:28:52
vemos, estamos viendo
00:28:53
herramientas ahora mismo a nivel muy básico
00:28:55
con ciertas pautas en general
00:28:58
de programación para usarlas
00:29:00
¿vale? de las que vamos dejando caer
00:29:01
pues lo que decimos
00:29:04
nada de métodos largos
00:29:06
métodos cortos que hagan cosas atómicas
00:29:07
si hay código compartido
00:29:10
hacer una estructura jerárquica
00:29:14
Ese tipo de cosas
00:29:15
Bueno, pues entonces
00:29:17
Vamos a aprovechar aquí entonces
00:29:19
Este proyecto
00:29:22
Para meter un poco por encima
00:29:22
Porque tampoco tiene mucha historia
00:29:26
Esto no tiene mucho interés
00:29:28
El concepto de tipos enumerados
00:29:29
Luego esto lo subo al proyecto, al aula virtual
00:29:31
Con los comentarios
00:29:33
Y lo indicamos
00:29:34
Bueno, pues entonces
00:29:36
Yo aquí tengo tres conceptos
00:29:38
Tres ideas
00:29:41
círculo, cuadrado
00:29:42
y triángulo
00:29:44
en esos tres me muevo
00:29:46
y yo voy a pedir por teclado
00:29:47
uno de esos tres conceptos
00:29:50
uno de esos tres
00:29:52
vale, pues entonces me voy a
00:29:53
hacer ese tipo enumerado, me lo voy a
00:29:56
construir
00:29:58
me voy aquí a mi paquete
00:29:59
y ahora aquí me creo
00:30:02
directamente en new os aparece
00:30:06
en un, en el entorno de desarrollo.
00:30:10
En este me da igual Intel IE cualquiera.
00:30:12
Y como veis, el código, aquí le damos un tipo.
00:30:16
Pues, por ejemplo,
00:30:18
tipo figura.
00:30:19
Por ejemplo,
00:30:22
vamos a llamarle. ¿Veis?
00:30:23
Entonces, esto,
00:30:31
el código Java para hacer un enumerado
00:30:33
es como si hiciéramos una clase,
00:30:35
pero aquí en lugar de clase pone
00:30:37
en un. ¿Vale? En lugar de clase
00:30:39
en un. Entonces,
00:30:41
esto no define una clase.
00:30:43
Esto no es una clase, no. Esto es un contenedor de posibilidades, ¿vale? Un contenedor de posibilidades. Es como crear un tipo personalizado para nosotros donde aquí ponemos el abanico de posibilidades.
00:30:45
El tipo personalizado es tipo figura. Y ahora el conjunto de posibilidades se las ponemos aquí. ¿Cómo se suele poner? Pues directamente con el nombre del concepto en mayúscula, separado por coma.
00:31:02
Tengo tres posibilidades, triángulo, círculo y cuadrado.
00:31:17
Y este ya es un enum perfectamente válido, ¿vale?
00:31:29
Estoy diciendo, oye, tipo figura,
00:31:35
las variables que sean de tipo figura,
00:31:39
porque ahora habrá variables string, variables int,
00:31:42
variables double, variables alumno,
00:31:45
variables figura geométrica,
00:31:48
pues también puede haber variables de tipo figura.
00:31:50
y esas variables solo pueden tener 3 valores
00:31:54
triángulo, círculo y cuadrado
00:31:56
¿vale?
00:31:58
entonces, esto no son figuras
00:32:00
es el tipo de figura
00:32:02
entonces
00:32:04
¿cómo podríamos usar esto aquí?
00:32:06
¿vale? pues aquí podría
00:32:11
ahora ese tipo figura ¿cómo se usa?
00:32:12
pues por ejemplo
00:32:15
ahora este tipo
00:32:16
tipo figura
00:32:19
yo lo puedo usar así, tipo figura
00:32:20
punto círculo
00:32:28
entonces esto
00:32:29
tiene dentro la posibilidad
00:32:34
círculo
00:32:36
y a tipo le podría dar la otra posibilidad
00:32:37
no son nada
00:32:41
lo que realmente son
00:33:06
a ver, son
00:33:08
en realidad son objetos
00:33:10
objetos únicos
00:33:11
es decir
00:33:14
esto es que no es tan fácil de entender
00:33:16
en realidad, la idea general sí
00:33:18
pero como está construido
00:33:20
por dentro no
00:33:22
volviendo atrás un momento
00:33:22
vale, esto es una variable
00:33:24
normal y corriente, mi variable tipo
00:33:26
como la podría llamar variable o la podría llamar como me diga
00:33:29
la gana, es una variable, pero esta variable
00:33:31
tiene la peculiaridad
00:33:33
por ser de este tipo
00:33:34
tiene la peculiaridad de tener solo
00:33:36
tres valores posibles y ya está
00:33:39
y sus tres valores posibles
00:33:41
son este, este y este
00:33:43
ya está, eso es lo básico
00:33:44
del numerado, crear variables
00:33:47
la voy a cambiar de nombre
00:33:49
por si lo de
00:33:51
bar
00:33:52
lo de tipo nos lía
00:33:53
o variable cualquiera, esta
00:33:56
vale, entonces esto se ve mejor
00:33:58
esto es muy típico, el ejemplo típico que se
00:34:10
dice siempre, en el que se entiende mejor
00:34:12
vamos a, por ejemplo
00:34:13
mi aplicación trabaja con una idea
00:34:15
que son días de la semana
00:34:18
vale
00:34:19
vamos a
00:34:21
sacarlo de este proyecto, vamos a ponerlo
00:34:23
aquí, en otro paquete, ejemplo
00:34:26
enum, para verlo más claro, no, y luego ya
00:34:27
venimos a este para hacerlo para este, para no, me voy a hacer aquí
00:34:29
otro paquete en este proyecto que subo
00:34:33
ejemplo enum, vale
00:34:38
pues en ejemplo enum, voy a cerrar
00:34:41
todo esto para no liarlo y esto por ahora lo voy a quitar
00:34:50
de aquí, vale
00:34:54
venga, ejemplo enum, lo típico, pues
00:35:00
Tú tienes una aplicación, por ejemplo, en la que estás haciendo, tienes una clase que es una cita que recoge una cita médica.
00:35:07
Por ejemplo, recoge una cita médica en una aplicación de citas médicas.
00:35:19
Tienes aquí tu string que recoge el doctor con el que está la cita médica.
00:35:25
y tienes aquí otra propiedad de mi cita médica
00:35:30
que es el día de la semana en la que la tengo,
00:35:35
la cita médica, ¿vale?
00:35:39
Ahora mismo me olvido de Getset porque, bueno,
00:35:41
todo menos ahora.
00:35:43
Vale, entonces yo podría dejar así esta clase y muy bien.
00:35:45
Pero, claro, se podría convertir en una especie
00:35:49
de sumidero de errores porque aquí admite
00:35:52
que yo en el día ponga praplaplum.
00:35:55
entonces cuando yo luego consulto
00:35:58
en mi aplicación
00:36:00
a ver que día tengo la cita con este doctor
00:36:02
me sale día plaplaplum
00:36:05
pues hombre, se me ha colado el error
00:36:07
pero cuando yo quería poner miércoles cuando la ingresé
00:36:08
se me fue el dedo y puse
00:36:11
plaplaplum, entonces eso ahora yo voy a
00:36:12
consultar y no lo entiendo
00:36:14
¿por qué? porque claro
00:36:16
día es un string
00:36:18
pero en string cabe cualquier cosa
00:36:20
entonces yo lo podría dejar así
00:36:22
pero luego cuando yo
00:36:24
en la parte de la aplicación de ingresar
00:36:26
la cita, meta el día,
00:36:28
tengo que ser muy cuidadoso de validar
00:36:30
con un bucle que realmente meta un día
00:36:32
válido, en fin.
00:36:34
Bueno, pues, ejemplo típico
00:36:37
que se usa para Enum.
00:36:38
Vamos a ver. Esto solo
00:36:40
tiene siete posibilidades.
00:36:42
De lunes a domingo, solo tiene
00:36:45
siete. Pues en lugar de
00:36:46
que día pertenezca al tipo string,
00:36:48
que día pertenezca a un tipo
00:36:51
personalizado mío que me voy a hacer,
00:36:52
que solo tenga siete posibilidades.
00:36:54
Y ya está.
00:36:57
Y así no hay margen de error.
00:36:58
Este día, una vez que ha llegado aquí y se ha inyectado,
00:37:00
ese día solamente puede ser uno de los cuatro, de los siete.
00:37:03
Pues entonces me tengo que hacer ese tipo personalizado.
00:37:08
Pues venga, ese tipo personalizado será un enum.
00:37:13
Por ejemplo, día-semana.
00:37:19
Día-semana.
00:37:24
Aquí tengo mi enum.
00:37:25
¿Cuáles son las siete posibilidades?
00:37:28
las 7, vamos a poner 5
00:37:30
para no escribir tanto
00:37:32
y porque no trabajan en fin de semana
00:37:34
no, no, no
00:37:37
no hace falta poner punto y coma
00:37:46
lo puedes poner, pero no es necesario
00:37:50
vale
00:37:52
es necesario si luego le añades más cosas abajo
00:37:53
pero ahora mismo todavía no se las hemos añadido
00:37:56
vale, este es el enum normal y corriente, básico
00:37:57
ahora, este es un tipo personalizado
00:38:00
entonces yo ahora
00:38:03
a cita
00:38:04
le cambio y digo, oye cita no es
00:38:05
string
00:38:08
cita es día
00:38:09
semana, mucho
00:38:11
mejor diseñada así la aplicación
00:38:14
porque ahora
00:38:16
a día solamente se le
00:38:18
puede asignar uno de esos cinco valores
00:38:20
ya está, no se le puede asignar nada más
00:38:22
entonces
00:38:24
bueno, tiene más sentido la aplicación
00:38:26
entonces vamos a poner aquí
00:38:28
el main
00:38:30
vale, pues entonces me voy a hacer yo
00:38:32
una cita
00:38:52
cualquiera
00:38:53
estoy pasando de get y set y todo
00:38:56
porque ahora mismo me da igual
00:38:59
vale, pues a cita.doctor
00:39:01
le puedo dar
00:39:06
lo que me dé la gana
00:39:08
es un string, le puedo dar lo que quiera
00:39:09
pero a cita.día
00:39:12
no le puedo dar
00:39:17
lo que a mí me dé la gana
00:39:20
le puedo dar solo uno de esas cinco posibilidades
00:39:21
y a esas cinco posibilidades
00:39:24
¿cómo se accede?
00:39:26
se accede así
00:39:27
día, semana, punto
00:39:28
la que sea
00:39:31
o sea, es imposible darle a
00:39:32
cita día algo que no sea una de esas
00:39:38
cinco, entonces tiene
00:39:40
mucho más sentido
00:39:42
vale, ahora tú preguntabas
00:39:43
pero esto físicamente que es
00:39:48
físicamente en realidad
00:39:50
no es un stream
00:39:52
esto físicamente es un objeto
00:39:53
pues que tiene recogido
00:39:56
ese yo soy el objeto lunes
00:39:58
físicamente
00:40:00
es un objeto, sin más.
00:40:02
Entonces, como es un objeto,
00:40:05
tiene métodos también.
00:40:06
¿Veis? Cita.día
00:40:21
que tiene este valor.
00:40:23
Si veis los métodos que
00:40:25
tiene, tiene un
00:40:27
método. Por ejemplo, el name
00:40:29
que me saca
00:40:31
vamos a mostrar
00:40:33
lo que me saca. Me saca
00:40:36
en string lo que yo
00:40:57
he escrito ahí.
00:40:59
Tiene un método
00:41:10
ordinal
00:41:12
que me saca
00:41:14
el orden en el cual
00:41:16
está situado
00:41:18
eso dentro del enum, que bueno
00:41:20
puede tener interés, depende de la aplicación
00:41:22
o puede no tenerlo
00:41:24
el lunes
00:41:25
está en la posición 0
00:41:28
pero si yo le dijera el martes
00:41:30
me va a sacar que está en la posición 1
00:41:32
¿vale?
00:41:34
bueno, ¿con qué
00:41:42
se conjuga esto muy bien?
00:41:43
Esto se conjuga muy bien con el switch case
00:41:44
Porque ahora yo ya puedo hacer un switch case
00:41:47
De esta manera
00:41:50
Switch cita día
00:41:52
Y ahora hago aquí
00:41:58
Case lunes
00:42:04
Bla, bla, bla
00:42:10
¿Vale? Vamos a ponerlo así
00:42:12
Case martes
00:42:15
Bla, bla, bla
00:42:23
¿Vale?
00:42:26
Espera, voy a ponerlo con los dos puntos
00:42:29
para que me quite el error de compilación
00:42:30
pero no voy a poner código ahora
00:42:32
vale, entonces
00:42:34
conjuga muy bien con esto
00:42:49
eso es lo que ya sé que te inquieta
00:42:51
vale, pues esto es para lo típico
00:43:08
para lo que se usa un enum
00:43:16
vale, si tú sabes
00:43:18
que una variable va a tener solamente
00:43:20
un conjunto finito de valores
00:43:22
te haces un enum con esos
00:43:24
y ya solamente puedes hacer
00:43:26
hacer asignaciones de una de esas cinco
00:43:28
posibilidades.
00:43:30
Y luego eso encaja clavado
00:43:32
con el suitcase.
00:43:34
¿Vale? Encaja y clavado en función
00:43:36
de que sean estos los patatines. Hasta ahí
00:43:38
vale. Entonces, clara,
00:43:40
claro. Ahora la
00:43:42
pregunta es, y si yo tengo,
00:43:44
aquí lo he asignado directamente, le he dicho
00:43:46
martes. Pero si yo lo tengo
00:43:48
que meter por teclado, porque yo por teclado
00:43:50
solo meto un string. Esto no
00:43:52
es un string, esto no es el string
00:43:54
martes, no. Esto es
00:43:56
un objeto
00:43:58
sin más, uno de estos cinco objetos de aquí
00:43:59
aquí hay cinco objetos
00:44:03
que son los cinco posibles valores
00:44:06
son los cinco posibles valores
00:44:08
y uno de esos cinco es el que yo he metido aquí
00:44:10
entonces para meterlo por teclado
00:44:15
pues solamente puedo leer un string
00:44:18
entonces tengo la forma cutre
00:44:20
entre comillas, pero que siempre puedo recurrir a ella
00:44:24
que es leerlo, hacer un switch case
00:44:27
en función del string que sea, asignarle el valor
00:44:30
y en el caso de que no sea uno de ellos
00:44:33
estarle metiendo en un while y ya está
00:44:36
esa sería la forma de hacerlo
00:44:39
lo que pasa es que para que eso no embarre mucho el main
00:44:41
se puede hacer
00:44:45
incluso aquí porque el enum
00:44:48
admite que tú metas métodos a los que luego puedes
00:44:51
llamar, lo que pasa es que bueno, esto ya nos complica
00:44:54
mucho las cosas, por ejemplo, vamos a hacer un
00:44:58
método que me devuelva
00:45:02
un día de la semana
00:45:12
leer de teclado
00:45:13
vale, entonces le voy a dejar aquí el null para quitarlo de compilación, paramos un segundito
00:45:19
para que lo maduréis y descanséis, ya lo vemos
00:45:27
vale, entonces yo puedo meter aquí
00:45:30
toda esa complejidad de leer
00:45:33
por teclado el string
00:45:35
compararlo a ver si es uno de los
00:45:37
válidos, si no patatín
00:45:39
patatán y cuando ya
00:45:41
pues lo haya hecho bien devolverlo
00:45:43
entonces lo puedo hacer así
00:45:45
y entonces ahora yo ya de aquí
00:45:46
podría llamar directamente
00:45:48
a díasemana
00:45:50
punto
00:45:52
leer teclado
00:45:54
y ya está
00:45:57
¿Vale? Sería lo más limpio
00:45:59
¿Vale?
00:46:02
Y ahora metemos aquí
00:46:04
El código que falta, ¿vale? Vamos a parar un momentito
00:46:06
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 22 de enero de 2026 - 11:16
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 46′ 13″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 188.71 MBytes