Clases Genéricas - 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:
Si habláis en este momento, como estoy grabando, me autorizáis a grabar vuestra voz.
00:00:00
Esta va a ser una sesión de teoría bastante breve, para introducir un concepto y para que sepáis que exista y que luego ahora lo utilizaremos en la otra parte de la clase.
00:00:09
No voy a grabar porque como es implementación, luego os doy el resultado de la implementación.
00:00:26
Y es el siguiente concepto.
00:00:31
Nosotros estamos acostumbrados a jugar, a utilizar clases que tienen dentro definidos los tipos de los atributos que vamos a utilizar.
00:00:34
Yo tengo la clase Persona, dentro tiene un objeto String que es el nombre, tiene un Int que es una edad, etc.
00:00:49
Puede haber situaciones y casos en el que yo tengo una clase que dentro utiliza algo, utiliza un atributo, pero el tipo de este atributo no me queda claro a priori.
00:00:57
Imaginaos, así es para hacer un ejemplo teórico, una bolsa.
00:01:16
Vosotros tenéis la clase Bolsa, donde dentro podéis poner lo que os da la gana.
00:01:22
Y un día dentro de la bolsa podéis poner el objeto Coche, otro día podéis poner el objeto Calculadora, y otro día podéis poner el objeto Rectángulo.
00:01:27
Y que luego vuestra bolsa haga algo con este objeto, dependiendo pero del tipo de objeto que yo estoy introduciendo.
00:01:37
Y que esto no está decidido a priori cuando yo creo la clase, sino que cuando uso la clase quiero especificar esta bolsa que puede contener.
00:01:48
Eso en Java es una clase genérica, es decir que yo en vez de decirme, mira este atributo aquí tiene un tipo String, pues le voy a dar un tipo genérico que luego cuando tú utilizarás esta clase me dirás que tipo es.
00:02:01
Entonces para utilizar un tipo genérico de este tipo, cuando yo declaro la clase aquí le pongo que esta clase se basa sobre un tipo genérico.
00:02:21
Normalmente para indicar un tipo genérico se utiliza una letra, y esta letra representa algo.
00:02:37
En realidad puedes utilizar lo que te da la gana, es un identificador.
00:02:45
Pero normalmente es una letra sola, por convención T estaría como tipo, o V podría ser como valor, o puedes usar lo que te da la gana.
00:02:48
Normalmente nosotros utilizamos T, no es obligatorio utilizar T.
00:02:58
Esto quiere decir que cuando crearé una clase genérica le tendré que especificar que tipo de objetos huye a esta clase genérica.
00:03:02
Y luego que puedo hacer, por ejemplo puedo decir, y tú tendrás un atributo 1, este T será el tipo que yo voy a utilizar.
00:03:12
Si aquí le digo que quiero hacer una clase genérica con tipo genérico String, pues automáticamente este atributo será un String.
00:03:26
Si yo le digo un coche, pues esto será un coche. Si yo le digo cocodrilo, pues esto será cocodrilo.
00:03:35
Y es un tipo genérico, yo ahora mismo mientras estoy haciendo la clase no lo sé que tipo es.
00:03:43
Cuando ahora en el Main me creo una clase genérica, pues le tendré que decir de qué quiero, y por lo tanto en automático este de aquí será un String.
00:03:50
O será un lo que sea.
00:04:01
Tengámoslo así sencillo.
00:04:03
Quiero crear una clase genérica.
00:04:08
Una clase genérica X es igual a new una clase genérica.
00:04:11
Esto sería un constructor normal y corriente de siempre.
00:04:23
Ahora le tendría que definir, si quiero, si no quiero posiblemente esto sería un Object.
00:04:30
Le puedo definir qué tipo de clase genérica quiero utilizar.
00:04:37
Definir esta cosa aquí.
00:04:46
Entonces la puedo definir aquí.
00:04:48
Cuando yo defino así, pues le estoy diciendo que el tipo que voy a utilizar aquí sería un String.
00:04:54
Por lo tanto, como aquí dentro yo utilizo un atributo T, pues este atributo de aquí será un String.
00:05:02
Y esto quiere decir que ahora si yo acedo a X.atrib1, como veis que para él es un String.
00:05:11
Si yo le dijera, no, mira, quiero hacer una clase genérica que dentro tiene objetos Scanner.
00:05:31
Son otros objetos que nosotros utilizamos.
00:05:40
Ahora cuando yo voy a mirar X.atrib1, para él ahora es un Scanner.
00:05:44
Esto nos viene principalmente útil ahora cuando haremos las colecciones.
00:05:54
Porque yo cuando creo una colección, tengo una colección que es una lista de objetos.
00:06:01
Sí, pero ¿qué objetos quieres ahí?
00:06:06
Entonces puedo hacer una lista de personas, puedo hacer una lista de String, puedo hacer una lista de Scanner,
00:06:08
puedo hacer una lista de cualquier objeto que yo identifique ahí.
00:06:14
La lista en general será un objeto general, será con un tipo genérico.
00:06:18
Pero si yo he hecho una lista donde puedo añadir objetos, le diré que puedes añadir objetos de tipo T.
00:06:27
Y si luego he hecho una lista de String, podrás añadir String.
00:06:34
Si le digo que has hecho una lista de coches, podrás añadir objetos de tipo coche.
00:06:38
Es como una abstracción, una generalización de lo que hay ahí dentro.
00:06:46
Y esto más o menos se indica aquí y luego se utiliza el tipo allá donde quieras.
00:06:52
Puedo crear un Array de objetos T.
00:07:00
Array conjunto de T.
00:07:08
Claramente cuando yo creo esto, pues esto tendrá más sentido.
00:07:17
Esto yo estoy enseñando más bien la sintaxis, el utilizo de esto.
00:07:22
Pero no estoy haciendo nada de eso, no lo estoy identificando ni nada.
00:07:27
Entonces, cuando yo he hecho esta cosa aquí de Scanner, si yo ahora hago x.conjunto de T, veis que es un Array de Scanner.
00:07:33
La idea es que donde yo haya utilizado T, ahora es lo que yo le he pasado aquí al momento de crear.
00:07:52
Y que yo pueda crear un public void método1 que pille como parámetros un T.
00:08:02
Un parámetro.
00:08:15
Y ahora sé que este método de aquí, cuando le tendré que pasar un parámetro, y este parámetro es de tipo el tipo que tú has seleccionado al momento de crear.
00:08:19
Si tú le has dado aquí String, pues este será método1 que pille un String.
00:08:29
Si te has puesto aquí coche, pues será que cuando tú lo haces aquí tendrás que pasarle como parámetro coche.
00:08:33
Y yo por ejemplo aquí podría hacer un param.toString y él utilizará el toString de la clase al que pertenece cuando será creado.
00:08:39
¿Dudas?
00:08:49
Tengo un objeto, creo un constructor, por ejemplo aquí, y voy a crear un objeto nuevo.
00:09:00
Y cuidado, por ejemplo, aquí tengo pequeños problemas, ¿vale?
00:09:13
Porque claro, cuando yo tengo que crear un objeto y tengo que instanciar este señor, yo no puedo, no sé qué objeto es.
00:09:17
Lo que no puede hacer es un mute.
00:09:28
¿Vale?
00:09:31
Porque si yo intento hacer esto, él se enfada.
00:09:32
Dice, oye mira, no puedo instanciar el tipo T porque no sé qué tipo es el T.
00:09:40
Y no existe.
00:09:45
¿Vale?
00:09:47
Entonces una opción que puede hacer es esta de aquí.
00:09:48
Digo, mira, yo te creo un nuevo objeto y este objeto lo castigo a T.
00:09:51
Pero cuidado, este es muy peligroso.
00:09:55
¿Por qué es peligroso esto?
00:09:57
Porque afectaría a cualquier tipo de T.
00:10:01
Porque tecnicamente yo estoy creando un objeto.
00:10:06
Un objeto genérico.
00:10:09
No estoy creando nada de T.
00:10:12
Y luego te estoy diciendo si es un T.
00:10:13
Pero no estoy usando el constructor de T.
00:10:15
Entonces este de aquí tiene muchas probabilidades que explote.
00:10:17
¿Vale?
00:10:21
Esta cosa aquí no me gusta mucho.
00:10:22
Lo más probable, lo más interesante sería, vale, pásamelo aquí.
00:10:24
Pásame un objeto de aquí.
00:10:28
Y yo lo que hago es ponértelo aquí dentro.
00:10:30
Entonces a la hora de utilizarlo.
00:10:36
Cuando tú vas a identificar que este de aquí es de tipo string.
00:10:39
Cuando tú me crearás un objeto me pasarás aquí un string.
00:10:44
¿Vale?
00:10:48
Que se corresponderá a eso.
00:10:49
Entonces esto ya lo guardaré como string.
00:10:51
Si yo aquí te he puesto que es de coches.
00:10:54
Pues entonces al crearlo aquí te paso un coche.
00:10:58
Y tú pondrás un coche aquí dentro.
00:11:01
¿Sí?
00:11:03
Otra opción es dejar esto vacío.
00:11:04
O sea, sin nada.
00:11:07
Y luego utilizar setter y getter.
00:11:11
¿Vale?
00:11:13
Y hacérmelo yo.
00:11:14
Yo me creo siempre un objeto de clase genérica vacío.
00:11:15
Y luego después voy añadiendo objetos con los métodos que se basan sobre el tipo genérico.
00:11:19
Y por lo tanto funcionará.
00:11:27
Entonces este de aquí no me da errores.
00:11:36
¿Vale?
00:11:39
Porque al fin y al cabo yo puedo guardar aquí un objeto.
00:11:40
Pero cuidado con el cast de esto porque podría enfadarse.
00:11:43
¿Sí?
00:11:47
Aquí también mismo problema.
00:11:49
¿Vale?
00:11:51
Estoy creando un objeto nuevo de tipo objeto.
00:11:52
Y luego lo estoy casteando a t.
00:11:56
Hay que ver si este t luego no se enfada.
00:11:58
¿Vale?
00:12:00
Aquí...
00:12:01
Da un error.
00:12:04
Ah, porque le he puesto esto.
00:12:11
Aquí es un par de ejemplos de utilizo.
00:12:15
¿Vale?
00:12:19
Entonces yo por ejemplo tengo un ejemplo clase genérica que es de tipo string.
00:12:20
Por lo tanto esta es la variable que define esta referencia aquí.
00:12:25
Y aquí lo que hago es un ejemplo clase genérica utilizando como tipo string.
00:12:30
¿Vale?
00:12:36
Entonces aquí he fijado que esta t es en realidad un tipo string.
00:12:37
¿Vale?
00:12:43
Entonces a este punto puedo acceder a un objeto, ponerle dentro y me lo acepta porque acepta strings.
00:12:44
¿Vale?
00:12:51
O en una red de objetos genéricos en posición cero y ponerle un string porque esto es una red de string ahora.
00:12:52
¿Vale?
00:13:00
Fijaos que puedo crearme otro objeto.
00:13:01
Otro objeto de clase genérica.
00:13:05
Es la misma clase.
00:13:08
Pero ahora le digo que oye tú no contienes strings y no contienes personas.
00:13:09
Entonces tu objeto t ahora está asociado con personas.
00:13:14
Y entonces ahora dentro donde antes le ponía un string que me decía todo bien,
00:13:18
ahora aquí le pongo una nueva persona.
00:13:23
Y me dice ok.
00:13:27
¿Vale?
00:13:28
Porque este objeto de aquí como clase genérica utiliza una persona y no un string.
00:13:29
La idea de fondo se entiende.
00:13:36
Es parametrizar en un cierto sentido un tipo sin ligarme a que esto tiene que ser un string y no puede ser otra cosa.
00:13:38
Sino dejarlo libre.
00:13:45
¿Vale?
00:13:47
A que yo pueda estanciar cuando lo necesito.
00:13:48
Fijaos que no es que se estancia a tiempo de ejecución.
00:13:51
Esto es siempre tiempo de compilación.
00:13:53
¿Vale?
00:13:55
Mientras yo estoy codificando, mientras yo estoy programando pues decido que este objeto de aquí tiene personas.
00:13:56
La idea es crear objetos, crear clases que sean suficientemente genéricas para que puedan trabajar con distintos tipos de objetos.
00:14:02
¿Vale?
00:14:11
Donde esto se usa en varias cosas pero donde esto viene intuitivamente claro es cuando ahora, y lo veremos en un minuto,
00:14:12
pues vamos a utilizar colecciones.
00:14:19
¿Vale?
00:14:22
Pensar de un array en un cierto sentido.
00:14:23
Con un array ya lo estamos utilizando esto porque tú puedes hacer un array de string o un array de enteros o un array de personas.
00:14:28
El concepto de array es siempre el mismo, como utilizáis el array, como accedes a cada una.
00:14:35
Es siempre lo mismo pero el tipo de datos que estáis almacenando pues varia.
00:14:40
En vez de utilizar los arrays que es una cosa que Java me proporciona directamente,
00:14:45
lo que estoy haciendo es creándome mi propia clase, mi propio objeto que trabaje como yo quiero que trabaje,
00:14:51
pero no me fijo en un determinado tipo que es el que trabaje sino lo dejo libre para que tú puedas utilizarlo cuando te vayas.
00:15:01
Si yo creo un objeto colección, es lo que decíamos antes de los arrays tienen el problema que tienen un tamaño fijo.
00:15:07
Si ahora quiero salirme de ese problema y decir quiero crearme una clase que oculte lo que haya debajo,
00:15:15
si es un array, si es otra forma de hacer las cosas, pero quiero que más o menos sea una colección de datos,
00:15:23
que yo pueda almacenar allí dentro datos.
00:15:29
Si tengo una nueva persona pues la almaceno allí dentro.
00:15:32
Si tengo 39 personas la almaceno allí dentro.
00:15:34
Y sigo adelante así y puedo buscar y puedo hacer cosas con esta clase.
00:15:36
Pero no quiero que esta colección sea solo de string.
00:15:43
No quiero hacer 37 veces la colección de string, colección de personas, colección de objetos, colección de...
00:15:47
porque cada vez que hay un objeto nuevo si no debería estar otra vez a crearme una nueva colección,
00:15:54
una nueva clase colección de el nuevo objeto que he creado.
00:15:59
Entonces la quiero hacer más abstracta, tener una colección de no sé qué, de clases genéricas, de tests.
00:16:02
Y luego sea la persona que lo va a utilizar que implemente que esta vez lo quiero hacer un array de aeropuertos.
00:16:10
Entonces esta es un poquito la idea de clase genérica.
00:16:23
Ahora la vamos a aplicar en lo que vamos a ver a continuación.
00:16:26
A continuación lo que vamos a hacer es esto.
00:16:32
Os he preparado una interfaz.
00:16:35
Que es la interfaz MyCollection.
00:16:39
La interfaz MyCollection de un tipo genérico.
00:16:42
La idea es que yo pueda crear objetos, digamos, clases que implementen esta interfaz
00:16:47
y que para implementar esta interfaz tengan que implementar estos métodos.
00:16:58
La idea es la que decíamos antes.
00:17:05
Es decir, yo hasta ahora cuando tenía que almacenar un conjunto de objetos
00:17:08
lo que podía hacer y lo que hacía era utilizar un array.
00:17:13
Entonces yo me creaba un array de 10 posiciones, empezaba a meter personas allí
00:17:17
y teníamos estos problemas de que hago cuando llego a que está lleno mi array
00:17:21
y tengo que añadir una persona nueva.
00:17:26
Y aquí había varias opciones que hemos visto.
00:17:28
Es decir, puedo añadir de uno en uno.
00:17:31
Tenía 10 posiciones, pues ahora pongo un array de 11 posiciones, copio las primeras 10
00:17:33
y en la última pongo la persona nueva.
00:17:39
Tenía la posibilidad de doblar, es decir, cuando 10 ya no son suficientes
00:17:41
pues creo un nuevo array pero lo creo de 20.
00:17:46
Y eso me permite añadir la siguiente y hasta 9 más.
00:17:50
Cuando ya no está aquí pues lo doblo otra vez y ya tengo 40.
00:17:54
¿Qué ventaja tenía esto?
00:17:57
Que perdía menos tiempo en copiar.
00:17:59
Porque cada vez que copio el array pues estoy perdiendo tiempo para nada.
00:18:02
Estoy sustancialmente haciendo una operación de copia de todas las referencias de los objetos
00:18:06
pero no me sirve de nada.
00:18:11
No me está aportando nada.
00:18:13
Es simplemente porque lo necesito por problemas técnicos de no tengo más espacio.
00:18:15
Entonces, quiero olvidarme de eso.
00:18:20
Quiero extraer eso y simplemente crear una colección donde yo le digo
00:18:24
añade un objeto y que sea él por debajo el que hace ese trabajo.
00:18:32
A partir de que yo haya hecho mi classes, mi collection,
00:18:37
pues no tengo que volver a preocuparme de cómo se hace eso de los arrays por debajo.
00:18:42
Yo lo que hago es le digo añádeme este objeto y él según la implementación que haya hecho yo
00:18:47
hará lo que tiene que hacer.
00:18:52
Y así con todas las otras funciones.
00:18:54
Si os fijáis, estas son funciones para manejo de colecciones de objetos.
00:18:58
Puedo añadir un objeto, puedo saber cuánta es grande la colección actual,
00:19:03
es decir, cuántos objetos tengo almacenados ahora.
00:19:07
Puedo decir vaciar a toda.
00:19:10
Puedo decir, oye, mira, esta colección contiene este objeto.
00:19:12
O puedo pillar un objeto en un índice específico.
00:19:16
Ahora ya veremos qué quiere decir esto cuando lo implementaremos.
00:19:21
Puedo remover un objeto, es decir, búscame este objeto aquí y quítalo.
00:19:25
O puedo hacer remuéveme el objeto en posición 7.
00:19:30
Ahora la colección tendrá que contar 7 elementos, sea como sea el contar estos elementos.
00:19:34
Y cuando llegue al elemento 7, pues eso lo borrará.
00:19:42
O tu array, es decir, tú tienes una colección, ahora transfórmame en un array y dame este array.
00:19:45
Porque a lo mejor luego a partir de aquí quiero hacer algo con este array y lo quiero borrar.
00:19:52
Estas no son todas las operaciones que se podrían hacer sobre una colección.
00:19:57
Luego veremos qué es la colección de Java, pero eso a posteriori.
00:20:01
Mi idea es que ahora lo vamos a implementar nosotros, vamos a hacer nuestras colecciones.
00:20:06
Y cuando ya hemos entendido qué quiere decir implementar una colección,
00:20:11
qué quiere decir hacer estas cosas y que hay formas distintas de hacerlas
00:20:16
y que me puedo inventar mis modos para hacer las mismas cosas.
00:20:20
A ese punto vamos a ver qué nos proporciona Java.
00:20:23
Que son las clases que existen ya en Java y que me permiten hacer esto
00:20:28
de una forma posiblemente más optimizada, más segura, con menos problemas
00:20:33
y sobre todo que yo no me pueda olvidar de tener que hacerlo cada vez.
00:20:37
Porque ya están dentro del jr.
00:20:41
De paso, vamos a repasar tanto gestión de array como otras cosillas un poquito más interesantes
00:20:47
que veremos y esto de aquí, cada uno de estos métodos, al fin y al cabo
00:20:58
será un pequeño algoritmo que tengo que implementar.
00:21:04
Por lo tanto nos viene bien a nosotros porque son ejercicios mirados
00:21:08
como eso de pillar un array y aumentarlo o cosa por eso.
00:21:12
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 14
- Fecha:
- 1 de marzo de 2023 - 11:25
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 21′ 22″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 178.64 MBytes