What’s Object

Trong Kotlin, từ khóa object được sử dụng để khai báo một "đối tượng" (object). Một đối tượng là một thực thể duy nhất, độc lập với các lớp (class), mà chỉ có một phiên bản duy nhất trong toàn bộ ứng dụng.

Có hai cách chính để sử dụng object trong Kotlin:

  1. Object Expressions: Đây là cách tạo một đối tượng không cần định nghĩa một class riêng. Object expressions cho phép bạn tạo ra một instance của một lớp không đặt tên (anonymous class) một cách linh hoạt. Ví dụ:
val obj = object {
    val name = "John"
    val age = 30
    fun greet() {
        println("Hello, my name is $name and I am $age years old.")
    }
}

obj.greet() // In ra: Hello, my name is John and I am 30 years old.

  1. Singleton Objects: Đối tượng singleton là một cách để đảm bảo rằng một class chỉ có một phiên bản duy nhất trong toàn bộ ứng dụng. Điều này thường được sử dụng khi bạn muốn chia sẻ một tài nguyên duy nhất như một hàm helper, một đối tượng service, hoặc một đối tượng đại diện cho một hệ thống.
object MySingleton {
    fun doSomething() {
        println("Doing something...")
    }
}

MySingleton.doSomething() // In ra: Doing something...

Trong cả hai trường hợp, object đều tạo ra một đối tượng duy nhất mà bạn có thể truy cập trực tiếp mà không cần tạo một phiên bản mới từ class.

What’s Data Class

Trong Kotlin, một "data class" là một lớp được thiết kế đặc biệt để lưu trữ và xử lý dữ liệu. Kotlin cung cấp data class như một cách tiện lợi để định nghĩa các lớp chỉ chứa dữ liệu mà không cần triển khai nhiều mã boilerplate.

Khi bạn khai báo một lớp là một data class, Kotlin sẽ tự động tạo ra một số thành phần chuẩn bao gồm các hàm equals(), hashCode(), toString(), và một hàm copy(). Điều này giúp làm cho việc làm việc với dữ liệu trong các data class trở nên đơn giản hơn và giảm thiểu lượng mã mà bạn cần phải viết.

Dưới đây là một ví dụ đơn giản về một data class trong Kotlin:

data class Person(val name: String, val age: Int)

Với đoạn mã trên, Kotlin sẽ tự động tạo ra các hàm equals(), hashCode(), toString() và một hàm copy() cho lớp Person.

val person1 = Person("Alice", 30)
val person2 = Person("Alice", 30)

println(person1 == person2) // In ra: true

val person3 = person1.copy(name = "Bob")

println(person3) // In ra: Person(name=Bob, age=30)

Như bạn có thể thấy, với data class, bạn có thể so sánh các đối tượng dựa trên nội dung của chúng bằng cách sử dụng ==, và bạn cũng có thể tạo bản sao của đối tượng một cách dễ dàng bằng cách sử dụng hàm copy().

So sánh Class và Data Class

Class:

  1. Phương thức mặc định: Khi bạn định nghĩa một class thông thường trong Kotlin, bạn cần tự viết các phương thức như equals(), hashCode(), toString(), và copy() nếu cần thiết.
  2. Mutable và Immutable: Mặc định, các thuộc tính của class không phải lúc nào cũng là immutable (bất biến), có thể thay đổi giá trị. Bạn phải tự xác định xem một thuộc tính nên là immutable hay mutable.