Igualdad Referencial (===) e Igualdad Estructural(==) en Kotlin

Resultado de imagen de compare

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.

 

Documentación Oficial