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 接口。
相关文章
如何在 Java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,