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 1Mộ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 lambdaThử 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("; "))
}
}
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toán3Đối tượng và đối tượng đồng hành
Khai báo đối tượngĐối tượng đồng hànhHằng số với constBiểu thức đối tượngÔn tập: Phòng bán véTự luyện tập: Playground Kotlin