Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 6-02-24 - 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 esto del equals
00:00:00
efectivamente tiene tanta
00:00:04
implicación práctica
00:00:06
tiene tanta trascendencia que de nuevo
00:00:09
el eclipse y
00:00:11
casi cualquier otro entorno de desarrollo
00:00:12
me deja generarlo de forma automática
00:00:14
y me ahorro escribirlo todo
00:00:17
pero cuidado porque estamos
00:00:18
utilizando muchísimo
00:00:21
esos recursos de vagos
00:00:22
y hay que tener cuidado
00:00:24
de que se usen cuando realmente se sabe
00:00:26
lo que uno quiere hacer
00:00:28
entonces voy a comentar mi versión
00:00:30
y a ver que genera
00:00:32
el eclipse
00:00:34
aquí de nuevo en source
00:00:35
pues uno tiene uno que pone
00:00:39
generar hashcode and equals
00:00:40
no deja por separado
00:00:43
hashcode and equals
00:00:46
entonces el te dice
00:00:47
lo que te saca aquí es a ver
00:00:48
cual es el campo que marca tu igualdad
00:00:50
entonces tu seleccionas
00:00:54
el código
00:00:56
con que los códigos de dos cuidadores
00:00:57
sean iguales pues eso para mi es la igualdad
00:01:00
podría ser que no, podría ser no
00:01:01
en mi aplicación
00:01:03
dos cuidadores sean iguales
00:01:05
si son iguales tanto el código como el nombre
00:01:08
depende
00:01:10
estas conclusiones derivarán del análisis que hayamos
00:01:11
hecho y del estudio que hayamos hecho
00:01:14
con el cliente de la aplicación con el que nos
00:01:15
explica con habremos estudiado la situación
00:01:18
al detalle todas las casuísticas que se pueden
00:01:20
dar pues después de haber estudiado
00:01:22
todos los requisitos
00:01:24
al dedillo de nuestra aplicación
00:01:26
y situación
00:01:27
podemos responder a estas cosas claro
00:01:29
entonces en nuestro caso a lo mejor la respuesta podría ser no no en mi caso
00:01:33
el código lo identifica de forma única
00:01:36
si el nombre es diferente es que se han hecho dos instancias porque uno se
00:01:39
llamó luis pepito y el otro luis
00:01:43
pero se refieren al mismo se refieren al mismo cuidado
00:01:45
bueno pues eso repito estas preguntas se tienen que resolver después de que uno
00:01:48
haya estudiado bien
00:01:52
su caso concreto bueno pues si en nuestro caso hemos decidido que el
00:01:53
código es lo que marca la unicidad es decir que es la clave primaria
00:01:57
pues marcamos solamente código venga general y cual saber cómo lo generas y
00:02:03
él me genera dos meje al jasco que ahora mismo no nos hace falta
00:02:09
pero va a ser fundamental más adelante también para mí me nos hace falta fuera
00:02:12
y nos genera un eequals como veis nos hace un equals un pelín más sofisticado
00:02:17
un pelín más sofisticado
00:02:24
¿Vale? Pero lo podemos entender perfectamente.
00:02:27
Él nos dice, a ver, si las direcciones de memoria son la misma,
00:02:31
ahí es que no hay más que mirar.
00:02:35
Obviamente es que los códigos van a ser el mismo.
00:02:37
Si las direcciones de memoria son la misma, es que están apuntando al mismo lado.
00:02:40
Entonces ahí está claro, el igual tiene que devolver true.
00:02:43
¿No hay otra? ¿Cómo no van a ser iguales los códigos
00:02:46
si las direcciones están apuntando al mismo sitio?
00:02:48
Ahí devuelve true. ¿Vale?
00:02:51
Luego te dice, a ver, si el objeto que le pasas es null,
00:02:53
entonces ya sé que es falso, que no puede ser igual que el otro.
00:03:01
¿Por qué no puede ser igual que el otro?
00:03:07
Porque me podríais decir, anda, y si el otro es null, son iguales.
00:03:09
¿Por qué no puede ser igual que el otro?
00:03:12
Porque es imposible que el que llama al método sea null.
00:03:17
Es imposible, porque un null no puede.
00:03:21
Si yo hago c1.equals y c1 es null,
00:03:23
es que ni entraría jamás al método.
00:03:29
No entraría, porque la máquina virtual me diría
00:03:31
e null pointer exception, ni entra.
00:03:34
Con lo cual, si he llegado a este punto, es porque he entrado en el método
00:03:37
o lo que es lo mismo, porque el objeto que lo llamo no es null.
00:03:40
Porque es que si no, no habría entrado, me habría salido un null pointer exception.
00:03:44
Entonces, si he llegado aquí, es porque el que le llamo no era null.
00:03:48
Con lo cual, si este sí lo es,
00:03:51
pues es que son distintos, obviamente, pues falsos.
00:03:53
Vale, ya tenemos dos casos que entendemos.
00:03:57
Ahora, este es un método, también de object,
00:04:01
que te devuelve la clase, o sea, un identificador, una cosa interna,
00:04:06
de la clase del objeto.
00:04:13
Ahora mismo, no hace falta que nos metamos en complicaciones en él,
00:04:16
simplemente, como está en object, lo puede llamar cualquier objeto.
00:04:19
Y te devuelve, empaquetado de una manera extraña,
00:04:23
codificado de una manera extraña,
00:04:28
cuál es el nombre de la clase a la que pertenece ese objeto,
00:04:30
el nombre de la clase.
00:04:34
Vale, pero no te lo devuelve en string, en string no.
00:04:36
Lo devuelve en otro formato.
00:04:38
Vale, pues entonces, este te dice, a ver,
00:04:40
si la clase a la que pertenece dis,
00:04:43
porque esto es como si hubiera aquí un dis, ¿verdad?
00:04:45
Porque cuando tenemos una llamada a un método al que nadie lo llama,
00:04:49
es como si fuera esto.
00:04:51
A lo mejor así lo veis más claro.
00:04:53
Pues si la clase del objeto que llama al equals es diferente de esta clase,
00:04:56
de nuevo, puedo devolver false,
00:05:01
porque es que no tiene sentido decir que los cuidadores son iguales,
00:05:03
si este objeto no es cuidador, o este no lo es,
00:05:07
o sea, que no pertenece a la misma clase.
00:05:10
Entonces, si no pertenece a la misma clase,
00:05:12
también puedo concluir que imposible que sean iguales.
00:05:15
Es que ni pertenecen a la misma clase, luego imposible que sean iguales, false.
00:05:17
Vale.
00:05:22
Entonces, si hemos llegado a este punto,
00:05:22
es porque ni ha salido por aquí, ni ha salido por aquí, ni ha salido por aquí.
00:05:23
Con lo cual, si hemos llegado a este punto es
00:05:29
porque este objeto obj no solo no es null,
00:05:32
sino que su clase es la misma que la que el que llama al método,
00:05:36
que es la misma.
00:05:40
Porque si no, habría salido por aquí.
00:05:41
Pues como ya sabemos que es la misma,
00:05:43
pues hace el casting sin ningún problema,
00:05:46
lo hace sin problema porque sabe
00:05:50
que la clase
00:05:52
de obj es la misma que la clase del objeto disk, que es cuidador.
00:05:53
Lo sabe, entonces hace el casting sin ningún problema,
00:05:57
lo convierte en este y ahora ya te devuelve
00:06:01
true si los códigos son iguales.
00:06:06
Vale, y es como si hubiera un disk, es lo mismo.
00:06:09
Te devuelve true si los códigos son iguales y falsos y son diferentes.
00:06:16
Entonces, es una versión un poquito más completa,
00:06:20
es una versión más completa.
00:06:22
Es una versión más completa.
00:06:22
Nosotros en el nuestro de arriba no habíamos distinguido si éste era null,
00:06:23
si la clase era distinta.
00:06:30
Nos habíamos lanzado a hacer el casting directamente confiando en que el que llamara
00:06:32
equal siempre lo iba a llamar pasándole un objeto cuidador distinto de null.
00:06:36
Entonces, si le pasa siempre un objeto cuidador distinto de null,
00:06:41
este equal funciona perfectamente.
00:06:44
El equals que teje en el eclipse es un poquito más completo porque considera todos los casos.
00:06:46
Que tú le pases un objeto cuidador distinto de null,
00:06:51
que tú le pases un null,
00:06:53
que le pases un objeto de otra clase distinta,
00:06:54
que no es cuidador,
00:06:56
te considera todos los casos.
00:06:57
Pero en última instancia,
00:07:01
si tú le pasas un objeto cuidador,
00:07:02
te devuelve true si los códigos son iguales
00:07:04
y falses y no,
00:07:06
que es de lo que se trata.
00:07:07
Que el equal se devuelva true o falsa.
00:07:09
¿Vale?
00:07:12
Bueno, pues entonces, de nuevo,
00:07:13
en general,
00:07:16
cuando uno tiene sus entidades ya definidas en una aplicación,
00:07:17
client de factura, no sé qué, no sé cuántos,
00:07:20
pues lo habitual es que en ellas se incluyan
00:07:23
los constructores, por supuesto,
00:07:25
los get y los set para acceder a las propiedades,
00:07:27
el toString por si alguien lo usa alguna vez
00:07:30
para mostrar una descripción,
00:07:33
como el system.out.println, por ejemplo,
00:07:36
que ya hemos visto que lo usa,
00:07:38
y el equals para recoger la condición de igualdad entre objetos,
00:07:40
para recogerla.
00:07:46
Habrá aplicaciones en las cuales
00:07:49
que la igualdad entre objetos no está recogida,
00:07:50
no importa,
00:07:53
porque no hay ninguna funcionalidad
00:07:54
que tenga en ningún momento
00:07:56
que distinguir si los objetos son iguales o no.
00:07:57
Pero es muy raro.
00:08:00
Es muy raro que una aplicación,
00:08:01
según se va ampliando en funcionalidad,
00:08:03
no necesite alguna vez
00:08:04
ver si los objetos son iguales.
00:08:05
Es muy raro que no lo necesite.
00:08:07
Entonces, por defecto,
00:08:09
lo natural es que se incluya en las clases de entidades
00:08:12
también una sobrescritura del equals.
00:08:14
Una sobrescritura del equals.
00:08:17
¿Y para qué esta sobrescritura?
00:08:19
Para que la sobrescritura sea correcta,
00:08:20
pues tengo yo que entender bien mi aplicación
00:08:22
y entender qué hace que dos objetos sean iguales.
00:08:24
Qué es lo que hace.
00:08:27
Si es el código, si es el código y el nombre,
00:08:28
si es no sé qué.
00:08:30
Y todo eso, de nuevo,
00:08:31
pues deriva de que yo entienda bien mi aplicación,
00:08:32
lo que tengo que hacer,
00:08:35
cómo tiene que funcionar, etcétera, etcétera.
00:08:36
Vale, luego es importante que entendáis bien todo esto,
00:08:42
porque ahora ya no se trata de
00:08:45
hago un programa, me funciona o no me funciona.
00:08:46
Programar no va de eso.
00:08:49
A ver, va, pues bueno, programas pequeñitos
00:08:52
que uno hace en plan divertimento.
00:08:54
Pues hacer factoriales, hacer no sé qué.
00:08:56
Vale, ahí sí va, me funciona o no me funciona.
00:08:57
Pero en general va de desarrollar aplicaciones
00:09:00
que funcionar, pues te van a funcionar.
00:09:02
Tú haces un código, lo despliegas en un servidor
00:09:04
y te hace cosas.
00:09:06
Pero esa aplicación puede ser una caca o no.
00:09:08
Funcionando igualmente.
00:09:12
Y que sea una caca o no.
00:09:13
Es decir, que lo que me saque,
00:09:15
pues sea realmente utilizable, tenga sentido.
00:09:19
Yo lo pueda luego ampliar.
00:09:22
Pues va a depender de tener mucho control
00:09:24
de todas estas cosas.
00:09:26
Esto ya no es me está funcionando o no me está funcionando.
00:09:27
Esto es, esto está bien hecho,
00:09:29
según los criterios de desarrollo.
00:09:31
Esto es usable, esto es reutilizable.
00:09:33
Esto es ampliable, que lo que se suele llamar es escalable.
00:09:36
O sea, yo puedo escalar y añadir otra funcionalidad fácilmente.
00:09:39
Esto le meta todos los casos de prueba que le meto.
00:09:42
Lo que me saca tiene sentido.
00:09:48
O a veces me saca cosas que, uh, qué raro.
00:09:50
¿Y cómo me saca esto?
00:09:52
Pues te saca esto,
00:09:53
pero no te das cuenta de que aquí no es sobre escrito este método.
00:09:54
Entonces te está tirando de otra cosa y tú no lo sabes.
00:09:56
Pero es importante que todo esto lo tengáis controlado.
00:09:59
Porque no es algo que se vea en, uy, me funciona o no me funciona.
00:10:03
No se ve así.
00:10:06
Entonces es difícil detectar por qué algo no funciona
00:10:08
si esto no está controlado.
00:10:12
¿Vale?
00:10:14
¿Eh?
00:10:19
¿Qué has dicho?
00:10:21
¿Qué es prueba de examen?
00:10:22
¿Qué es prueba de examen dices?
00:10:24
A ver, es muy difícil, es muy complicado.
00:10:26
En un examen de dos, tres horas, obviamente,
00:10:28
pues va a hacer algo que ponga en, que meta en cuestión de todas estas cosas.
00:10:31
Pero, pero aquí se trata de aprobar por un lado y luego de vuestro futuro.
00:10:39
O sea, aprobar solamente no vale.
00:10:46
Aprobar solo no vale.
00:10:49
Es aprobar y además haber sacado todo el aprobé.
00:10:52
Porque es que es imposible.
00:10:56
No podemos examinar de todo lo que van a esperar de vos,
00:10:57
de todas las destrezas que van a esperar de vosotros.
00:11:00
Es que no se puede, no se puede examinar.
00:11:02
No podemos poner una aplicación en la que estéis dos semanas
00:11:04
y la traigáis por razones obvias, pero la podéis copiar.
00:11:06
¿Vale?
00:11:09
Entonces, aprobar, hombre, es condición necesaria.
00:11:10
Pero para que a uno le vaya bien y no acabe en la calle rápidamente,
00:11:14
pues además tiene que aprovechar
00:11:18
todo lo que pueda estos dos años,
00:11:20
pues para coger, empaparse de todo lo que vea
00:11:23
y de todas las solturas que,
00:11:25
y de todo lo que de alguna manera os decimos
00:11:27
y vosotros mismos vais indagando por ahí.
00:11:29
Bueno, pues entonces.
00:11:32
¿Del equals?
00:11:35
¿Alguna duda?
00:11:37
El equals en realidad ya lo hemos venido usando.
00:11:40
Lo hemos venido usando con el famoso stream.
00:11:43
Con el famoso stream.
00:11:45
¿Verdad?
00:11:48
¿Qué ocurría?
00:11:50
Y ya con esto de verdad que me callo por ahora.
00:11:52
¿Qué ocurría con el stream?
00:11:59
Vamos a ver.
00:12:01
Vamos a poner aquí.
00:12:02
Sí.
00:12:05
Voy a ponerlo aquí.
00:12:09
Ejemplos de equals.
00:12:16
Con stream.
00:12:19
En mi main.
00:12:25
¿Vale?
00:12:26
Porque luego este proyecto
00:12:27
lo subo entero pisando el que había.
00:12:28
Bueno, para que tengáis ahí.
00:12:30
Vale.
00:12:39
¿Qué hemos hecho nosotros?
00:12:40
¿El equals hasta ahora nosotros para qué lo habíamos usado?
00:12:41
Exclusivamente para esto.
00:12:44
Nosotros a lo mejor hacíamos un objeto stream S1.
00:12:46
Imaginaos que le damos un valor.
00:12:48
Pues ya está.
00:12:50
Hola.
00:12:51
Hala.
00:12:52
Tengo yo aquí mi stream S1.
00:12:53
Y ahora pues tenemos otro stream por ahí.
00:12:54
Stream S2.
00:12:55
Hala.
00:12:56
Hala.
00:12:57
Hala.
00:12:58
Hala.
00:12:59
Hala.
00:13:00
Hala.
00:13:01
Hala.
00:13:02
Hala.
00:13:03
Hala.
00:13:04
Hala.
00:13:05
Hala.
00:13:06
Hala.
00:13:07
Hala.
00:13:08
Hala.
00:13:09
Hala.
00:13:10
Hala.
00:13:11
Hala.
00:13:12
Hala.
00:13:13
Hala.
00:13:14
Hala.
00:13:15
Hala.
00:13:16
Hala.
00:13:17
Hala.
00:13:18
Entonces esta es la clase de stream.
00:13:19
Es una clase que ya está hecha en la máquina virtual.
00:13:20
No la hemos hecho nosotros.
00:13:22
Y ahora que ya entendemos los objetos ya en detalle, podemos ver algunas cosas que hemos
00:13:23
estado usando de ella un poco así, con las buenas, que no salen muy bien.
00:13:30
Por ejemplo, esto es muy raro.
00:13:34
Si S1 es un objeto, desde cuando un objeto se puede instanciar sin un new.
00:13:36
Desde nunca.
00:13:41
¿No?
00:13:42
Siempre hemos dicho que S1 tiene una variable objeto.
00:13:43
declarada como objeto
00:13:46
y ese 1 lo es
00:13:48
para habilitar el espacio
00:13:49
hay que hacerlo con new
00:13:51
no hay otra
00:13:52
y eso es verdad
00:13:53
lo que pasa es que la clase string está hecha
00:13:55
de tal manera que la programó
00:13:57
la programó para permitir este truco
00:13:59
y ese es un truco
00:14:01
que nos evita tener que hacer esto
00:14:03
que es llamar específicamente
00:14:06
al constructor de string
00:14:09
pasándole el parámetro
00:14:10
para iniciar la propiedad
00:14:12
o sea, uno podría instanciar
00:14:13
un objeto string con la forma ortodoxa
00:14:16
new string
00:14:19
el constructor de la clase string
00:14:20
al que podríamos entrar
00:14:22
porque está en la máquina virtual
00:14:23
vemos que recibe una cadena
00:14:24
y la usa para inicializar
00:14:26
la propiedad interna del string
00:14:28
que se sea raíz de chat
00:14:30
podría usar el método ortodoxo
00:14:31
para instanciar un objeto string
00:14:35
pero claro, como los objetos string
00:14:37
se usan continuamente
00:14:39
pues la clase string está hecha
00:14:40
para que nos permita
00:14:42
este atajo
00:14:43
nos permite este atajo
00:14:44
que nada, yo pongo directamente la cadena
00:14:46
y la máquina virtual
00:14:47
pues cuando llame a la clase string
00:14:49
ya ve, entra en el atajo y ya está
00:14:51
entonces, primera cosa
00:14:53
que ya era rara
00:14:55
pero ya hemos aclarado
00:14:58
string es un objeto, hay que instanciarlo
00:14:59
es que no hay otra, hay que instanciarlo
00:15:01
pero la clase nos permite este atajo
00:15:02
que es, le digo directamente esto
00:15:06
y esto es como hacer new string
00:15:08
¿vale? eso por un lado
00:15:09
vale, siguiente cosa
00:15:13
cuando comparábamos dos string
00:15:18
yo os decía
00:15:19
no comparéis nunca el string
00:15:21
con doble o igual
00:15:24
¿verdad?
00:15:25
compararlo con equal
00:15:28
precisamente por eso, porque esto
00:15:30
con lo que yo he dicho
00:15:31
S1 y S2
00:15:33
¿vale?
00:15:36
son dos objetos distintos
00:15:37
son dos objetos distintos
00:15:39
son dos direcciones de memoria distintas
00:15:41
entonces, según esto, no lo probéis
00:15:43
no lo hagáis
00:15:45
porque ahora os explico luego lo que pasa
00:15:46
¿vale? no lo hagáis
00:15:49
entonces
00:15:50
cuando yo tengo un string S1
00:15:52
que tiene hola
00:15:55
un string S2 que tiene hola
00:15:56
el sentido real de mi aplicación
00:15:58
es que si yo quiero ver
00:16:02
si S1 y S2 son iguales es que me diga true
00:16:03
es el sentido real
00:16:05
como cuando quiero ver dos cuidadores
00:16:07
son iguales, el sentido real es que si los códigos
00:16:09
sean iguales me diga true
00:16:11
pues aquí a mí me da igual que S1
00:16:13
sea una dirección de memoria que apunte a hola
00:16:15
y que S2 sea otra que apunte a otro hola distinto
00:16:17
son dos objetos distintos
00:16:20
está claro, apuntados por dos direcciones
00:16:23
la S1 y la S2
00:16:24
pero lo que tiene sentido
00:16:25
es
00:16:27
que me dijeran que son iguales
00:16:29
la condición de igualdad
00:16:31
tiene que ser por el contenido
00:16:33
de la cadena, no por las direcciones de memoria
00:16:36
¿vale?
00:16:38
por eso es por lo que os insistíamos
00:16:39
cuidado, si quieres ver si dos cadenas son iguales
00:16:41
no las compares así
00:16:43
así no
00:16:46
porque si las comparas así
00:16:48
lo que te compara es
00:16:50
la dirección de memoria S1
00:16:51
con la dirección de memoria S2
00:16:53
y ese no es el sentido real de las cosas
00:16:54
el sentido real de las cosas es
00:16:57
yo quiero ver si esta cadena y esta cadena
00:16:59
tienen el mismo texto
00:17:01
entonces decíamos
00:17:02
no la comparéis así
00:17:05
comparadla
00:17:06
así
00:17:08
y esto ya es otra cosa
00:17:13
¿vale?
00:17:15
porque esto ahora como ya sabemos
00:17:19
equals está sobrescrito
00:17:20
en la clase string
00:17:23
no usa el equals de object
00:17:24
usa el equals que está sobrescrito en la clase string
00:17:25
que ahora ya se mete en las cadenas
00:17:29
a ver si son iguales
00:17:30
¿vale?
00:17:32
entonces
00:17:33
, nosotros si ejecutamos esto
00:17:43
pues nos saldrá
00:17:50
iguales
00:17:51
¿verdad?
00:17:53
ay, perdón
00:18:00
es que no lo he puesto en el else
00:18:01
ahí
00:18:02
ahí, vale
00:18:04
¿vale?
00:18:06
si ejecutamos esto
00:18:08
nos sale
00:18:09
obviamente que son iguales
00:18:13
son dos objetos distintos
00:18:15
pero son iguales
00:18:17
y sin embargo
00:18:19
si hago esto
00:18:20
pues me saldrá
00:18:22
obviamente que son distintas
00:18:23
las cadenas
00:18:25
¿está claro, no?
00:18:25
porque el equals que está usando
00:18:26
es el sobrescrito de la clase string
00:18:28
si entramos en
00:18:30
aquí
00:18:32
este es
00:18:35
el método
00:18:37
equals que está en la clase string
00:18:38
en esta clase
00:18:41
la clase string
00:18:43
y la clase string tiene
00:18:48
su método
00:18:51
equals
00:18:52
este
00:18:53
que sobrescribe
00:18:56
¿vale?
00:18:59
que sobrescribe el método equals de object
00:19:00
y mirad que lo sobrescribe
00:19:02
haciendo aquí
00:19:04
un montón de basurilla
00:19:05
¿vale?
00:19:07
hace aquí un montón de cosas raras
00:19:08
y lo que hace es meterse
00:19:09
en la propiedad que tiene el onSharp
00:19:11
a eso ni me interesa
00:19:13
que sea igual, etcétera
00:19:13
lo sobrescribe
00:19:14
porque si no lo sobrescribiera
00:19:15
estaría comprando las direcciones de memoria
00:19:16
¿vale?
00:19:18
bueno, pues aquí hemos estado usando
00:19:21
el equals
00:19:23
todo el rato
00:19:25
¿vale?
00:19:27
ahora ya entendemos
00:19:29
que el equals es un método
00:19:30
que puede usar cualquier objeto
00:19:31
porque lo hereda de object
00:19:32
pero si usamos la versión heredada
00:19:33
dos objetos son iguales
00:19:36
solos
00:19:38
y las direcciones de memoria son iguales
00:19:39
y si queremos añadir otro criterio de igualdad
00:19:40
lo tendremos que sobrescribir en la clase
00:19:43
¿vale?
00:19:45
bueno, entendido, entendido
00:19:52
todo lo de equals
00:19:54
vale, pues no se puede olvidar
00:19:56
porque afecta de forma directa
00:19:58
a cualquier aplicación
00:20:00
sobre todo si se manejan colecciones
00:20:01
se manejan una serie de historias
00:20:03
que vamos a tener que manejar
00:20:05
claro
00:20:06
¿vale?
00:20:07
entonces, según eso
00:20:13
con lo que yo he dicho
00:20:14
ahora ya con todo eso entendido
00:20:17
si yo ejecuto esto
00:20:20
¿qué me saldría?
00:20:21
si he cambiado el equals por doble igual
00:20:23
¿iguales o distintas?
00:20:25
porque está sin miedo
00:20:30
distintas
00:20:31
pues no
00:20:43
estas son las maravillas
00:20:46
de la programación que me encanta
00:20:53
claro
00:20:54
pero por otro pequeñito matiz
00:20:56
que ya es el último que me falta por incorporar
00:20:58
¿vale?
00:21:00
esto prácticamente no lo sabe nadie
00:21:02
porque nadie se encuentra
00:21:05
con esta situación porque todo el mundo pone
00:21:07
equals
00:21:08
¿vale?
00:21:09
pero es que desde cierta
00:21:11
versión de Java hay una pequeña particularidad
00:21:13
que hace
00:21:15
que pase esto
00:21:17
y podemos obviarla
00:21:19
y hacer como que no existe
00:21:21
usamos equals siempre
00:21:22
y eso sería lo correcto
00:21:24
cuando yo comparo objetos
00:21:26
en concreto string, equals siempre
00:21:27
¿vale?
00:21:30
pero hay una pequeñita particularidad que os añado
00:21:31
para que la sepáis, vosotros si vais a ser de los más listos
00:21:33
y es
00:21:36
que Java para ahorrarse
00:21:37
espacio y memoria
00:21:39
hasta cierta cantidad
00:21:40
de cadenas
00:21:43
que no sé si son hasta 1048
00:21:44
o las que sean
00:21:46
esta cantidad
00:21:47
si detecta que dos objetos cadena
00:21:47
tienen el mismo texto
00:21:51
¿vale?
00:21:53
si detecta
00:21:54
entonces los lleva al mismo sitio
00:21:55
y los hace apuntar por la misma dirección
00:21:57
para no duplicar
00:21:59
lo hace internamente él
00:22:01
entonces ¿qué ha pasado?
00:22:03
ahora nosotros solo tenemos dos cadenas
00:22:05
nosotros, ese uno y ese dos
00:22:06
entonces su manejo interno
00:22:07
dice ah lo llevo al mismo sitio
00:22:09
lo llevo al mismo lado
00:22:10
entonces ¿qué pasa?
00:22:12
pues al llevarlo al mismo lado
00:22:13
el efecto es que esto también se cumple
00:22:14
pero ojo con eso
00:22:17
porque eso es a partir de cierta cantidad de cadenas
00:22:18
entonces
00:22:21
lo mejor es que nos olvidemos de que eso ocurre
00:22:22
y de que Java hace eso
00:22:25
por ahorrar
00:22:26
cosas suyas
00:22:27
que nos olvidemos
00:22:30
lo mejor es que usemos siempre equals para comparar cadenas
00:22:31
y así jamás
00:22:35
nos equivocaremos, jamás
00:22:36
¿tú utilizas ahora mismo el método 3-5
00:22:38
para cada uno de los otros objetos?
00:22:40
bueno el método toString de String
00:22:43
te da directamente la cadena
00:22:45
es que no puedo porque está sobrescrito
00:22:47
al estar sobrescrito
00:22:54
en cuanto yo haga ese uno toString
00:22:58
el de object ya no vale
00:23:00
me va a mostrar siempre
00:23:01
el de String
00:23:03
pero a ver
00:23:05
el tema es que
00:23:07
Java hace internamente estas cosas
00:23:09
por un tema de eficiencia de uso suyo
00:23:10
pero la idea es
00:23:13
que no las tengamos en cuenta a la hora de programar
00:23:14
porque si las tenemos en cuenta
00:23:17
nos puede inducir a error
00:23:18
porque a ver, yo sé
00:23:20
que hasta cierto número de cadenas va a funcionar así
00:23:22
entonces me da igual
00:23:25
usar el equals que el doble igual
00:23:26
pero para qué arriesgarme
00:23:28
que más me da, pongo el equals y ya está
00:23:30
y sé que así no me voy a equivocar jamás
00:23:32
os lo ponía solo como anécdota
00:23:34
porque hay veces que les sale una cosa
00:23:36
y decís, ¿y esto por qué?
00:23:38
pues bueno, son pequeños detalles de funcionamiento interno
00:23:40
que podemos obviar
00:23:43
y trabajar con lo ortodoxo
00:23:44
que es, dos cadenas se comparan con el equals
00:23:47
y así jamás, jamás
00:23:49
va a salir un resultado erróneo
00:23:51
nunca, porque el equals está hecho
00:23:53
para comparar que los dos textos sean iguales
00:23:55
¿vale?
00:23:57
entonces esto como si no lo hubiera escrito
00:23:59
dos cadenas
00:24:01
oe
00:24:03
¿por qué me sale este?
00:24:04
dos cadenas
00:24:07
se comparan siempre
00:24:08
con el equals
00:24:11
y listo
00:24:13
porque son objetos
00:24:14
esto es con lo que nos queremos quedar
00:24:16
¿vale?
00:24:18
¿vale?
00:24:25
bueno, pues por ahora
00:24:29
verencia, nos quedamos con todo esto
00:24:30
que en realidad ya es mucho
00:24:33
entre los días que llevamos ya es bastante
00:24:34
bueno, pues vamos a
00:24:36
poner aquí algún ejercicio
00:24:39
o algo para que
00:24:41
ya se vea bien
00:24:42
ya vosotros con vuestra cabeza
00:24:43
lo hagáis un poco ya organizadamente
00:24:44
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 7
- Fecha:
- 8 de febrero de 2024 - 12:46
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 24′ 49″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 108.00 MBytes