Deep copy of a List in Kotlin
This article explores different ways to create a deep copy of a List of Objects in Kotlin.
1. Using Copy Constructor
The recommended approach to copy objects in Kotlin is using the copy constructor, which accepts the instance of the same class and creates a deep copy for all mutable fields. This is demonstrated below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.time.LocalDateTime class User { private var name: String private var regDateTime: LocalDateTime constructor(name: String, regDateTime: LocalDateTime) { this.name = name this.regDateTime = regDateTime } constructor(user: User) { name = user.name regDateTime = LocalDateTime.from(user.regDateTime) } fun setRegDateTime(regDateTime: LocalDateTime) { this.regDateTime = regDateTime } override fun toString(): String { return "User(name='$name', regDateTime=$regDateTime)" } } fun main() { val users = listOf( User("User1", LocalDateTime.now()), User("User2", LocalDateTime.now()), User("User3", LocalDateTime.now().minusDays(2)) ) val clone = users.map(::User).toList() users[2].setRegDateTime(LocalDateTime.now()) for (user in clone) { println(user) } } |
Output:
User(name='User1', regDateTime=2018-12-30T18:00:00.00)
User(name='User2', regDateTime=2018-12-30T18:00:00.00)
User(name='User3', regDateTime=2018-12-28T18:00:00.00)
2. Implement Cloneable interface
To facilitate a field-by-field copy of a List of objects, we can iterate through the list and add a clone of each item to the new list. To create a clone of an object, have that object implement the Cloneable interface and override its clone() function.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import java.time.LocalDateTime class User(private val name: String, private var regDateTime: LocalDateTime) : Cloneable { public override fun clone(): Any { val user = super.clone() as User user.regDateTime = LocalDateTime.from(regDateTime) // date is mutable return user } fun setRegDateTime(regDateTime: LocalDateTime) { this.regDateTime = regDateTime } override fun toString(): String { return "User(name='$name', regDateTime=$regDateTime)" } } fun main() { val users = listOf( User("User1", LocalDateTime.now()), User("User2", LocalDateTime.now()), User("User3", LocalDateTime.now().minusDays(2)) ) val clone: MutableList<User> = mutableListOf() for (user in users) { clone.add(user.clone() as User) } users[2].setRegDateTime(LocalDateTime.now()) for (user in clone) { println(user) } } |
Output:
User(name='User1', regDateTime=2018-12-30T18:00:00.00)
User(name='User2', regDateTime=2018-12-30T18:00:00.00)
User(name='User3', regDateTime=2018-12-28T18:00:00.00)
3. Custom clone() function
We can also implement our own clone() function, instead of implementing the Cloneable interface and overriding its clone() function. This is demonstrated below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.time.LocalDateTime class User(private val name: String, private var regDateTime: LocalDateTime) { fun clone(): User { return User(name, LocalDateTime.from(regDateTime)) } fun setRegDateTime(regDateTime: LocalDateTime) { this.regDateTime = regDateTime } override fun toString(): String { return "User(name='$name', regDateTime=$regDateTime)" } } fun main() { val users = listOf( User("User1", LocalDateTime.now()), User("User2", LocalDateTime.now()), User("User3", LocalDateTime.now().minusDays(2)) ) val clone = users.map(User::clone).toList() users[2].setRegDateTime(LocalDateTime.now()) for (user in clone) { println(user) } } |
Output:
User(name='User1', regDateTime=2018-12-30T18:00:00.00)
User(name='User2', regDateTime=2018-12-30T18:00:00.00)
User(name='User3', regDateTime=2018-12-28T18:00:00.00)
That’s all about creating a deep copy of a List in Kotlin.
Thanks for reading.
To share your code in the comments, please use our online compiler that supports C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and support our growth. Happy coding :)