Menu
CoddyTech

Biểu thức đối tượng

Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 15 trên 57.

Biểu thức đối tượng tạo một đối tượng dùng một lần thuộc một lớp không tên, ngay tại nơi cần dùng. Biểu thức này có dạng object : Type { ... } và thường triển khai một giao diện. Giao diện liệt kê các phương thức mà không giải thích cách chúng hoạt động; chương 5 tìm hiểu kỹ về giao diện:

interface Greeter {
    fun greet(name: String): String
}

Bên trong main:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

Đầu ra:

Good morning, Ada.

Một khai báo đối tượng chỉ tồn tại một lần. Biểu thức đối tượng được đánh giá mỗi khi code của nó chạy, và mỗi lần chạy tạo ra một đối tượng mới. Biểu thức có thể đọc và thay đổi các biến cục bộ xung quanh nó:

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

Bên trong main:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

Đầu ra:

10 11 1

Một cách dùng phổ biến là giao việc xử lý cho một hàm trong thư viện. sortedWith nhận một Comparator, một giao diện có phương thức compare(a, b) trả về số âm khi a đứng trước, số không khi hòa và số dương trong trường hợp còn lại:

Bên trong main:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

Đầu ra:

[fig, kiwi, apple, banana]

Biểu thức đối tượng không có kiểu cha nhóm một vài giá trị vào một đối tượng cục bộ; bạn có thể dùng các thuộc tính của nó bên trong cùng một hàm. Khi một giao diện chỉ có một phương thức, biểu thức lambda thường ngắn gọn hơn biểu thức đối tượng. Biểu thức đối tượng phù hợp khi có nhiều phương thức hoặc cần lưu giữ một số trạng thái.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // dạng lambda
challenge icon

Thử thách

Dễ

Giao diện Validator có một phương thức (method), check(text), trả về thông báo lỗi hoặc null khi văn bản đạt yêu cầu. Hoàn thành hàm (function) rules(minLength) để hàm này trả về ba trình kiểm tra được tạo bằng biểu thức đối tượng, theo thứ tự sau: văn bản phải có ít nhất minLength ký tự (too short), chứa một chữ số (needs a digit) và không chứa khoảng trắng (no spaces allowed).

Code được cung cấp đọc độ dài tối thiểu, sau đó đọc từng mật khẩu trên một dòng. Code in ra ok hoặc tất cả thông báo lỗi của mật khẩu đó, nối với nhau bằng ; .

Code của bạn nằm trong Rules.kt và Validator.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

fun main() {
    // Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
    val input = generateSequence(::readLine).toList()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Kotlin