Clonar objeto en Kotlin

David Mbochi Njonge 20 junio 2023
  1. Generar un Proyecto Kotlin
  2. Utilice el método copy() de la clase de datos para clonar objetos en Kotlin
  3. Use el método clone() de ArrayList para clonar objetos en Kotlin
  4. Crear una función de extensión para clonar objetos en Kotlin
  5. Implementar la interfaz clonable para clonar objetos en Kotlin
  6. Conclusión
Clonar objeto en Kotlin

La funcionalidad de clonación generalmente se usa en lenguajes de programación orientados a objetos. La clonación se define como la creación de una copia de un objeto, lo que significa que el objeto copiado tiene las mismas propiedades y métodos que el objeto original.

Copiar un objeto ayuda a evitar el desperdicio de recursos porque reutiliza el objeto existente sin tomar todo el proceso de crear un objeto y agregarlo al Heap.

Este tutorial enseñará diferentes enfoques que podemos aprovechar para crear una copia o un clon de un objeto.

Generar un Proyecto Kotlin

Vaya al entorno de desarrollo de IntelliJ y seleccione Archivo>Nuevo>Proyecto. Ingrese el nombre del proyecto como kotlin-copy-object, seleccione Kotlin en la sección Idioma y seleccione Intellij en la sección Sistema de compilación.

Cree un archivo llamado Main.kt en la carpeta src/main/kotlin. Copie y pegue el siguiente código en el archivo.

data class Movie(var id: Int,
                 var name: String,
                 var genre: String,
                 var duration: Int);

fun fetchMovies(): ArrayList<Movie>{
    return arrayListOf(
        Movie(1,"Paws of fury","animation",60),
        Movie(2,"Green lantern","animation",80),
        Movie(3,"Hot seat","action",70),
        Movie(4,"Chip n Dale","fantasy",60),
        Movie(5,"Bullet train","mystery",80)
    );
}

En este código, hemos creado un método llamado fetchMovies() que devuelve una ArrayList de objetos Movie. Los objetos de la película se crean utilizando una clase de datos que también hemos definido en este código.

Las propiedades de los objetos de la película incluyen id, nombre, género y duración. La propiedad id es de tipo int, y las demás propiedades son de tipo cadena.

Usaremos el método fetchMovies() en algunos ejemplos cubiertos en este tutorial para mostrar cómo hacer una copia de un objeto en Kotlin.

Utilice el método copy() de la clase de datos para clonar objetos en Kotlin

Una clase de datos es una clase que se utiliza para almacenar datos temporalmente y proporciona al desarrollador algunas funcionalidades listas para usar. La clase de datos proporciona los siguientes métodos que el desarrollador puede aprovechar sin implementar su lógica: equals(), hashCode(), toString() y copy().

Copie y pegue el siguiente código en el archivo Main.kt después del método fetchMovies().

fun usingCopyOnDataClass(){
    val movie: Movie = fetchMovies()[2];
    val copyOfMovie: Movie = movie.copy();
    println(copyOfMovie);
}

fun main(){
    usingCopyOnDataClass();
}

En este código, hemos utilizado el método fetchMovies() que devuelve una ArrayList de los objetos Movie para obtener el objeto Movie en el índice 2.

Nuestro objetivo es hacer una copia del objeto aprovechando el método copy() proporcionado por la clase de datos. El método copy() de la clase de datos nos proporciona la misma copia de nuestro objeto.

Nota: No se crean nuevos objetos para realizar esto.

Tenga en cuenta que también puede cambiar algunas de las propiedades del objeto mientras mantiene el resto pasando los valores de las propiedades que desea cambiar como argumento del método copy().

Por ejemplo, si pasas el argumento copia(nombre = "Avengers"), el nombre de la nueva copia del objeto se cambiará por el que has proporcionado, y el resto no cambiará.

Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación.

Movie(id=3, name=Hot seat, genre=action, duration=70)

Use el método clone() de ArrayList para clonar objetos en Kotlin

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

fun usingCloneWithArrayList(){
    @Suppress("UNCHECKED_CAST")
    val movies: ArrayList<Movie> =
        fetchMovies().clone() as ArrayList<Movie>;
    movies.forEach(::println);
}

fun main(){
    usingCloneWithArrayList();
}

En este código, hemos usado el método fetchMovies() para crear una copia de la instancia de ArrayList devuelta usando el método clone().

El método clone() de ArrayList se hereda de la clase Objeto. Este método devuelve la instancia de la lista, lo que significa que los elementos no se copian.

Dado que el método clone() devuelve un Objeto, hemos utilizado la palabra clave as para convertirlo en ArrayList<Movie>. Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación.

Movie(id=1, name=Paws of fury, genre=animation, duration=60)
Movie(id=2, name=Green lantern, genre=animation, duration=80)
Movie(id=3, name=Hot seat, genre=action, duration=70)
Movie(id=4, name=Chip n Dale, genre=fantasy, duration=60)
Movie(id=5, name=Bullet train, genre=mystery, duration=80)

Crear una función de extensión para clonar objetos en Kotlin

Una función de extensión es una función que nos permite agregar funcionalidad a una clase existente sin modificar el código subyacente. Comente el código anterior y copie y pegue el siguiente código en el archivo Main.kt después del comentario.

fun Movie.clone(): Movie{
    val movie = Movie(
        this.id,
        this.name,
        this.genre,
        this.duration);
    return movie;
}

fun usingCloneExtensionFunction(){
    val movie = fetchMovies()[4];
    val clonedMovie = movie.clone();
    println(clonedMovie);
}

fun main(){
    usingCloneExtensionFunction();
}

En este código, hemos creado una función de extensión de la clase de datos Movie llamada clone(). Cuando se invoca la función de extensión de clonación, devuelve la instancia actual del objeto.

Para usar la función de extensión clone(), hemos usado el método fetchMovies() para recuperar la película en el índice 4 y luego invocamos la función clone() en ella. Esto crea una copia del mismo objeto que el objeto en el índice 4.

Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación.

Movie(id=5, name=Bullet train, genre=mystery, duration=80)

Implementar la interfaz clonable para clonar objetos en Kotlin

Al desarrollar aplicaciones y desea que se copie una clase en particular, generalmente agregamos esta funcionalidad a la clase implementando la interfaz Cloneable.

La interfaz Cloneable tiene un método llamado clone() que devuelve la representación de cadena de su clase. Lo único que debemos hacer es anular los métodos clone() y toString().

Tenga en cuenta que también debe hacer que el método clone() sea público.

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

class Student(
    private val firstName: String,
    private val lastName: String): Cloneable{

   public override fun clone(): Any {
        return super.clone()
    }

    override fun toString(): String {
        return "Student(firstName='$firstName', lastName='$lastName')"
    }

}

fun implementingCloneable(){
    val student: Student = Student("john","doe");
    val clonedStudent = student.clone();
    println(clonedStudent.toString());
}

fun main(){
    implementingCloneable();
}

En este código, hemos creado una clase llamada Estudiante con las propiedades firstName y lastName. Esta clase implementa la interfaz Cloneable y anula su método clone().

También hemos anulado el método toString() para que podamos registrar el objeto clonado en la consola.

implementingCloneable() crea una instancia de un objeto Student e invoca el método clone() para hacer una copia del objeto. Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación.

Student(firstName='john', lastName='doe')

Conclusión

En este tutorial, hemos aprendido cómo crear una copia de un objeto en Kotlin. Los enfoques que hemos cubierto incluyen el uso del método copy() de la clase de datos, el empleo del método clone() de ArrayList, la creación de una función de extensión y el uso de la interfaz Cloneable.

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