Kotlin 中的克隆对象
克隆功能通常用于面向对象的编程语言。 克隆被定义为创建对象的副本,这意味着复制的对象具有与原始对象完全相同的属性和方法。
复制对象有助于避免资源浪费,因为它会重用现有对象,而无需执行创建对象并将其添加到堆中的整个过程。
本教程将教授我们可以用来创建对象副本或克隆的不同方法。
生成 Kotlin 项目
转到 IntelliJ 开发环境并选择 File>New>Project 。 输入项目名称 kotlin-copy-object,在 Language 部分选择 Kotlin,在 Build system 部分选择 Intellij。
在文件夹 src/main/kotlin 下创建一个名为 Main.kt 的文件。 将以下代码复制并粘贴到文件中。
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)
);
}
在这段代码中,我们创建了一个名为 fetchMovies() 的方法,它返回 Movie 对象的 ArrayList。 电影对象是使用我们也在这段代码中定义的数据类创建的。
电影对象的属性包括 id、名称、流派和持续时间。 其中id属性为int类型,其他属性为string类型。
我们将在本教程涵盖的一些示例中使用 fetchMovies() 方法来展示如何在 Kotlin 中制作对象的副本。
在 Kotlin 中使用数据类的 copy() 方法克隆对象
数据类是用于临时保存数据并为开发人员提供一些开箱即用功能的类。 数据类提供了开发人员无需实现其逻辑即可利用的以下方法:equals()、hashCode()、toString() 和 copy()。
将以下代码复制并粘贴到 Main.kt 文件中的 fetchMovies()
方法之后。
fun usingCopyOnDataClass(){
val movie: Movie = fetchMovies()[2];
val copyOfMovie: Movie = movie.copy();
println(copyOfMovie);
}
fun main(){
usingCopyOnDataClass();
}
在此代码中,我们使用了返回 Movie 对象的 ArrayList 的 fetchMovies()
方法来获取索引 2 处的 Movie 对象。
我们的目标是利用数据类提供的 copy()
方法复制对象。 数据类的 copy()
方法为我们提供了对象的相同副本。
请注意,您还可以更改对象的某些属性,同时通过将要更改的属性的值作为 copy()
方法的参数传递来维护其余属性。
例如,如果您传递参数 copy(name = "Avengers")
,则对象的新副本的名称将更改为您提供的名称,其余不会更改。
运行此代码并确保输出如下所示。
Movie(id=3, name=Hot seat, genre=action, duration=70)
在 Kotlin 中使用 ArrayList 的 clone() 方法克隆对象
将前面的例子注释掉,将下面的代码复制粘贴到Main.kt文件注释后。
fun usingCloneWithArrayList(){
@Suppress("UNCHECKED_CAST")
val movies: ArrayList<Movie> =
fetchMovies().clone() as ArrayList<Movie>;
movies.forEach(::println);
}
fun main(){
usingCloneWithArrayList();
}
在此代码中,我们使用 fetchMovies()
方法创建了使用 clone()
方法返回的 ArrayList 实例的副本。
ArrayList 的 clone()
方法继承自 Object 类。 此方法返回列表实例,这意味着不会复制元素。
由于 clone()
方法返回一个对象,我们使用 as 关键字将其转换为 ArrayList<Movie>
。 运行此代码并确保输出如下所示。
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)
创建扩展函数以在 Kotlin 中克隆对象
扩展函数是一种允许我们在不修改底层代码的情况下向现有类添加功能的函数。 将之前的代码注释掉,将下面的代码复制粘贴到Main.kt文件注释后。
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();
}
在这段代码中,我们创建了名为 clone()
的 Movie 数据类的扩展函数。 当调用克隆扩展函数时,它返回对象的当前实例。
要使用 clone()
扩展函数,我们使用 fetchMovies()
方法检索索引 4 处的电影,然后对其调用 clone()
函数。 这将创建与索引 4 处的对象相同的对象的副本。
运行此代码并确保输出如下所示。
Movie(id=5, name=Bullet train, genre=mystery, duration=80)
在 Kotlin 中实现克隆对象的可克隆接口
当开发应用程序并且您希望复制特定类时,我们通常通过实现 Cloneable 接口将此功能添加到类中。
Cloneable 接口有一个名为 clone()
的方法,它返回类的字符串表示形式。 我们唯一需要做的就是覆盖 clone()
和 toString()
方法。
请注意,您还必须公开 clone()
方法。
将前面的例子注释掉,将下面的代码复制粘贴到Main.kt文件注释后。
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();
}
在这段代码中,我们创建了一个名为 Student 的类,它具有 firstName 和 lastName 属性。 此类实现 Cloneable 接口并覆盖其 clone() 方法。
我们还覆盖了 toString()
方法,以便我们能够将克隆的对象记录到控制台。
implementingCloneable()
创建一个 Student 对象的实例并调用 clone()
方法来复制该对象。 运行此代码并确保输出如下所示。
Student(firstName='john', lastName='doe')
总结
在本篇文章中,我们学习了如何在 Kotlin 中创建对象的副本。 我们介绍的方法包括使用数据类的 copy()
方法、使用 ArrayList 的 clone()
方法、创建扩展函数以及使用 Cloneable 接口。
相关文章
在 Kotlin 中继承具有多个构造函数的类
发布时间:2023/05/12 浏览次数:200 分类:Java
-
本文讨论如何扩展具有多个构造函数的类。 构造函数是在创建对象时调用的函数,用于初始化类变量。在 Kotlin 中扩展具有多个构造函数的类
Kotlin中栈数据结构的使用
发布时间:2023/05/12 浏览次数:130 分类:Java
-
本篇文章我们就来学习一下Kotlin中栈的使用。 我们还将看到用于更新和更改 Kotlin 堆栈的标准函数,包括 push、pop、peek、search 和 isEmpty。我们还将研究比 Kotlin 中的堆栈更好的替代方案。
Kotlin中findViewById函数的使用
发布时间:2023/05/12 浏览次数:183 分类:Java
-
Kotlin 中的 findViewById 允许在 ID 的帮助下查看和更新视图。 本文介绍了 Kotlin 中 findViewById 函数的使用。
Kotlin runBlocking:用协程代码桥接非协程世界
发布时间:2023/05/12 浏览次数:194 分类:Java
-
Kotlin runBlocking 函数允许阻塞整个线程。 我们将在本文中看到更多关于 Kotlin Coroutine runBlocking 的信息。
Kotlin Init 和构造函数之间的区别
发布时间:2023/05/12 浏览次数:67 分类:Java
-
构造函数和 Kotlin init 块是这种编程语言的重要组成部分。 本文概述了 init 和构造函数之间的区别。
在 Kotlin 中获取 SimpleName
发布时间:2023/05/12 浏览次数:154 分类:Java
-
本文介绍了在 Kotlin 中获取类的 SimpleName 的简单方法。 它显示了与 Java 的 getSimpleName() 方法等效的方法。
在 Kotlin 中将字符串拆分为数组
发布时间:2023/05/12 浏览次数:111 分类:Java
-
本教程将展示如何在 Kotlin 中将字符串拆分为字符串数组。 如上所述,您可以使用此技术通过从字符串数组中检索关键字来在应用程序中进行搜索。