Obtener la instancia de un objeto en Kotlin
-
Use
is
con genéricos para obtener la instancia de un objeto en Kotlin -
Use
is
con la palabra clavewhen
para obtener la instancia de un objeto en Kotlin - Conclusión
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 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