Obtener la instancia de un objeto en Kotlin

David Mbochi Njonge 30 enero 2023
  1. Use is con genéricos para obtener la instancia de un objeto en Kotlin
  2. Use is con la palabra clave when para obtener la instancia de un objeto en Kotlin
  3. Conclusión
Obtener la instancia de un objeto en Kotlin

Obtener la instancia de un objeto es una práctica de desarrollo común que encontraremos en la mayoría de los lenguajes de programación, como Kotlin, Java, TypeScript, JavaSript y otros. Un ejemplo de una situación en la que podría querer encontrar la instancia de un elemento es cuando desea ordenar los elementos según su tipo.

Al encontrar la instancia de un elemento, el resultado es verdadero si el elemento tiene el mismo tipo que el elemento con el que se compara; de lo contrario, devuelve falso.

En este tutorial, aprenderemos cómo obtener la instancia de un objeto en tiempo de ejecución usando Kotlin.

Use is con genéricos para obtener la instancia de un objeto en Kotlin

Genérico es un enfoque de desarrollo utilizado para diseñar nuestro código para que pueda reutilizarse usando cualquier tipo.

Vaya a IntelliJ y seleccione File > New Project para crear un nuevo proyecto de Kotlin. Ingrese el nombre del proyecto como kotlinInstancOf o cualquier nombre que prefiera.

Seleccione Kotlin en la sección Idioma e Intellij en la sección Sistema de compilación. Pulse el botón Crear para crear el proyecto.

Una vez creado el proyecto, cree la estructura de carpetas com/instanceOf en la carpeta kotlin. Cree un archivo llamado Main.kt en la carpeta instanceOf y copie y pegue el siguiente código en el archivo:

package com.instanceOf

interface Employee{
    fun work(): String;
}
class Manager(private val name: String): Employee{
    override fun work(): String {
        return "$name is preparing the project schedule";
    }

}
class Janitor(private val name: String): Employee{
    override fun work(): String {
        return "$name is cleaning the office";
    }

}
fun <T> doWork(Object: T): String {
    if (Object is Employee){
       return Object.work();
    }else{
        throw RuntimeException("$Object is not of type Employee")
    }
}

fun main() {
    println(doWork(Manager("John")));
    println(doWork(Janitor("Peter")));
    println(doWork("mary"));
}

En este ejemplo, hemos creado una interfaz llamada Employee y dos implementaciones concretas llamadas Manager y Janitor.

El doWork() es un método genérico definido anteriormente, que utiliza la palabra clave is para encontrar si el objeto pasado como argumento es del mismo tipo que Employee. Si la condición devuelve verdadero, invocamos el método work() del objeto; de lo contrario, lanzamos una RuntimeException().

En el método principal, llamamos al método doWork() 3 veces y pasamos el Manager, el Janitor, y una cadena como argumentos, respectivamente.

Las dos primeras invocaciones del método se evalúan como verdaderas porque tienen relación con el Employee. Pero la última invocación se evalúa como falsa porque el argumento de cadena no tiene relación con el Employee.

Ejecute el código para verificar que la salida sea como se muestra a continuación.

Exception in thread "main" java.lang.RuntimeException: mary is not of type Employee
John is preparing the project schedule
Peter is cleaning the office

Dado que la palabra clave es devuelve un booleano, podemos devolver el reverso de la palabra clave es agregando el carácter ! antes de la palabra clave. El personaje ! se suele pronunciar como no, lo cual es común cuando se trabaja con puertas lógicas.

Comenta el método doWork() y reemplázalo con el siguiente código:

fun <T> doWork(Object: T): String{
    if (Object !is Employee){
        throw RuntimeException("$Object is not of type employee");
    }
    return Object.work();
}

Vuelva a ejecutar el código y tenga en cuenta que el resultado es el mismo que el del ejemplo anterior:

John is preparing the project schedule
Peter is cleaning the office
Exception in thread "main" java.lang.RuntimeException: mary is not of type employee

Use is con la palabra clave when para obtener la instancia de un objeto en Kotlin

La palabra clave when funciona de la misma manera que la palabra clave switch funciona con Java. La única diferencia es la sintaxis.

Comente el ejemplo anterior y copie y pegue el siguiente código en el archivo Main.kt después del comentario.

fun fetchData() = listOf<Any>("book",3,true,"computer");

fun main() {
    for (data in fetchData()) {
        when(data){
            is String -> println(data)
            is Int -> println(data)
            is Boolean -> println(data)
        }
    }
}

En el ejemplo anterior, hemos creado un método fetchData() que devuelve una lista de tipo Any asignándola al método auxiliar listOf(). El método listOf() devuelve una lista que contiene los tipos String, Int y Boolean.

En el método main, determinamos el tipo de elemento en tiempo de ejecución iterando a través de la lista usando un bucle y delegando cada valor al método when(). Dentro del bloque when(), el tipo de valor pasado se determina usando is, y si la condición se evalúa como verdadera, el valor se registra en la consola.

Debe tener en cuenta que el valor no se registrará en la consola si agrega otro tipo en la lista sin encontrar su tipo dentro del bloque when().

Ejecute el código y verifique que el resultado sea como se muestra a continuación:

book
3
true
computer

Conclusión

En este tutorial, hemos aprendido cómo obtener la instancia de un elemento en tiempo de ejecución aprovechando el lenguaje de programación Kotlin. Los enfoques cubiertos incluyen: usar la palabra clave is con genéricos y la palabra clave is con la palabra clave when.

Tenga en cuenta que al usar genéricos, debemos asegurarnos de que estamos usando tipos reificados, lo que significa que la información del tipo está disponible en tiempo de ejecución; de lo contrario, la verificación de tipo no funcionará.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

Artículo relacionado - Kotlin Object