Veremos la diferencia entre Igualdad Referencial e Igualdad Estructural en Kotlin.
En Kotlin existen dos tipos de igualdad:
- Igualdad Referencial (2 puntos referencian al mismo objeto )
- Igualdad Estructural (se verifica mediante equal())
class Operators { private fun showCase1() { var a = 5 var b = 5 Log.w("OPERATORS-1", "Igualdad Referencial (===). ¿Es igual 'a' a 'b'? --> ${a === b}") // true Log.w("OPERATORS-1", "Igualdad Estructural (==). ¿Es igual 'a' a 'b'? --> ${a == b}") // true } private fun showCase2() { val persona1 = PersonaNormal() val persona2 = PersonaNormal() Log.w("OPERATORS-2", "Igualdad Referencial (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 === persona2}") // false Log.w("OPERATORS-2", "Igualdad Estructural (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 == persona2}") // false, porque no sobreescribe equal } private fun showCase3() { val persona1 = PersonaEqualOverride() val persona2 = PersonaEqualOverride() Log.w("OPERATORS-3", "Igualdad Referencial (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 === persona2}") // false Log.w("OPERATORS-3", "Igualdad Estructural (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 == persona2}") // true } private fun showCase4() { val persona1 = PersonaDataClass() //Ruben,27 val persona2 = PersonaDataClass() //Ruben,27 val persona3 = PersonaDataClass("Pepe") //Pepe,27 Log.w("OPERATORS-4", "Igualdad Referencial (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 === persona2}") // false Log.w("OPERATORS-4", "Igualdad Estructural (==). ¿Es igual 'persona1' a 'persona2'? --> ${persona1 == persona2}") // true Log.w("OPERATORS-4", "Igualdad Estructural (==). ¿Es igual 'persona2' a 'persona3'? --> ${persona2 == persona3}") // false } fun showCases() { showCase1() showCase2() showCase3() showCase4() } class PersonaNormal { val name = "Ruben" } class PersonaEqualOverride{ val name = "Ruben" override fun equals(other: Any?): Boolean { if(other === null) return false if(other is PersonaEqualOverride){ return other.name === this.name } return false } } data class PersonaDataClass(val name:String = "Ruben", val age:Int = 27) }
showCase1 –> TIPOS BASICOS
Igualdad Referencial ===
En otros lenguajes los tipos básicos (int, float,….) no tienen referencias, los objectos si tienen referencias.
En Kotlin todo es un objecto, pero hay excepciones donde Kotlin trata a los tipos basicos de forma mas inteligente, tratandolo como objectos aun no existiendo…
No compara las referencias en este caso, compara los valores.
Realiza lo mismo que el structural equality en este caso concreto
Igualdad Estructural ==
Compara el contenido
showCase2 –> OBJECTOS DE CLASES SIN EQUAL
Igualdad Referencial ===
Compara las 2 referencias de los objectos
Igualdad Estructural ==
Compara los 2 contenidos de los objecto PERO no esta la función equal() implementada.
showCase3 –> OBJECTOS DE CLASES CON EQUAL
Igualdad Referencial ===
Compara las 2 referencias de los objectos
Igualdad Estructural ==
Compara los 2 contenidos de los objecto utilizando la función equal()
showCase4 –> OBJECTOS DE DATA CLASS
Igualdad Referencial ===
Compara las 2 referencias de los objectos
Igualdad Estructural ==
Compara los dos datos de ambos objectos sin implementar el equal.
Data Class trae ciertos métodos ya sobrescritos con lógica que nos ahorra trabajo.