Chào mừng độc giả đến với Cafedev, nơi chia sẻ những kiến thức sâu rộng về lập trình và công nghệ. Hôm nay, chúng ta sẽ bắt đầu cuộc hành trình khám phá về “Null Safety in Kotlin” – một chủ đề quan trọng và thú vị. Trong Kotlin, Cafedev đã tích hợp hệ thống an toàn null giúp ngăn chặn các vấn đề tiềm ẩn với giá trị `null`. Điều này không chỉ giúp tăng cường độ tin cậy của mã nguồn mà còn là một lợi ích lớn trong quá trình phát triển ứng dụng Kotlin của bạn. Hãy cùng nhau khám phá và tận hưởng hành trình này!”
Trong Kotlin, có thể có giá trị null
. Để giúp ngăn chặn vấn đề liên quan đến giá trị null
trong chương trình của bạn, Kotlin có hệ thống Null safety. Null safety phát hiện vấn đề tiềm ẩn với giá trị null
tại thời điểm biên dịch, chứ không phải là thời điểm chạy.
Null safety là sự kết hợp của các tính năng cho phép bạn:
- Rõ ràng khai báo khi giá trị
null
được phép trong chương trình của bạn. - Kiểm tra giá trị
null
. - Sử dụng safe calls để truy cập thuộc tính hoặc hàm có thể chứa giá trị
null
. - Khai báo các hành động khi phát hiện giá trị
null
.
Nội dung chính
1. Kiểu có thể là null
Kotlin hỗ trợ kiểu có thể là null, cho phép khả năng cho kiểu được khai báo có thể có giá trị null
. Theo mặc định, một kiểu không được phép chấp nhận giá trị null
. Kiểu có thể là null được khai báo bằng cách thêm ?
sau khai báo kiểu.
Ví dụ:
fun main() {
// neverNull has String type
var neverNull: String = "This can't be null"
// Throws a compiler error
neverNull = null
// nullable has nullable String type
var nullable: String? = "You can keep a null here"
// This is OK
nullable = null
// By default, null values aren't accepted
var inferredNonNull = "The compiler assumes non-nullable"
// Throws a compiler error
inferredNonNull = null
// notNull doesn't accept null values
fun strLength(notNull: String): Int {
return notNull.length
}
println(strLength(neverNull)) // 18
println(strLength(nullable)) // Throws a compiler error
}
length
là một thuộc tính của lớp String chứa số lượng ký tự trong một chuỗi.
2. Kiểm tra giá trị null
Bạn có thể kiểm tra sự tồn tại của giá trị null
trong biểu thức điều kiện. Trong ví dụ sau, hàm describeString()
có một câu lệnh if
kiểm tra xem maybeString
không phải là null
và nếu length
của nó lớn hơn không:
fun describeString(maybeString: String?): String {
if (maybeString != null && maybeString.length > 0) {
return "String of length ${maybeString.length}"
} else {
return "Empty or null string"
}
}
fun main() {
var nullString: String? = null
println(describeString(nullString))
// Empty or null string
}
3. Sử dụng safe calls(Gọi một cách an toàn)
Để an toàn truy cập thuộc tính của một đối tượng có thể chứa giá trị null
, sử dụng toán tử safe call: ?.
. Toán tử safe call trả về null
nếu thuộc tính của đối tượng là null
. Điều này hữu ích nếu bạn muốn tránh việc sự xuất hiện của giá trị null
gây ra lỗi trong code của bạn.
Trong ví dụ sau, hàm lengthString()
sử dụng safe call để trả về độ dài của chuỗi hoặc null
:
fun lengthString(maybeString: String?): Int? = maybeString?.length
fun main() {
var nullString: String? = null
println(lengthString(nullString))
// null
}
Safe calls có thể được chuỗi nối để nếu bất kỳ thuộc tính nào của một đối tượng chứa giá trị null
, thì null
được trả về mà không có lỗi nảy ra. Ví dụ:
> person.company?.address?.country
Toán tử safe call cũng có thể được sử dụng để gọi an toàn một hàm thành viên hoặc mở rộng. Trong trường hợp này, kiểm tra null
được thực hiện trước khi hàm được gọi. Nếu kiểm tra phát hiện giá trị null
, thì cuộc gọi được bỏ qua và null
được trả về.
Trong ví dụ sau, nullString
là null
nên việc gọi của .uppercase() bị bỏ qua và null
được trả về:
fun main() {
var nullString: String? = null
println(nullString?.uppercase())
// null
}
4. Sử dụng toán tử Elvis
Bạn có thể cung cấp một giá trị mặc định để trả về nếu phát hiện giá trị null
bằng cách sử dụng toán tử Elvis ?:
.
- Viết bên trái của toán tử Elvis là điều gì cần được kiểm tra để giá trị
null
. - Viết bên phải của toán tử Elvis là điều gì sẽ được trả về nếu phát hiện giá trị
null
.
Trong ví dụ sau, nullString
là null
nên safe call để truy cập thuộc tính length
trả về giá trị null
.
Do đó, toán tử Elvis trả về 0
:
fun main() {
var nullString: String? = null
println(nullString?.length ?: 0)
// 0
}
Để biết thêm thông tin chi tiết hơn về Null safety trong Kotlin, xem Null safety.
5. Thực hành
5.1 Bài tập
Bạn có hàm employeeById
cho phép bạn truy cập vào cơ sở dữ liệu nhân viên của một công ty. Thật không may. Hàm trả về một giá trị kiểu Employee?
, vì vậy kết quả có thể là null
. Mục tiêu của bạn là viết một hàm trả về lương của một nhân viên khi được cung cấp id
, hoặc 0
nếu nhân viên không có trong cơ sở dữ liệu.
data class Employee (val name: String, var salary: Int)
fun employeeById(id: Int) = when(id) {
1 -> Employee("Mary", 20)
2 -> null
3 -> Employee("John", 21)
4 -> Employee("Ann", 23)
else -> null
}
fun salaryById(id: Int) = // Write your code here
Gợi ý:
fun main() {
println((1..5).sumOf { id -> salaryById(id) })
}
data class Employee (val name: String, var salary: Int)
fun employeeById(id: Int) = when(id) {
1 -> Employee("Mary", 20)
2 -> null
3 -> Employee("John", 21)
4 -> Employee("Ann", 23)
else -> null
}
fun salaryById(id: Int) = employeeById(id)?.salary ?: 0
fun main() {
println((1..5).sumOf { id -> salaryById(id) })
}
-> Kho tài liệu Free học Kotlin từ A->Z
Cuối cùng,
Chân thành cảm ơn bạn đã đồng hành cùng chúng tôi trong chuyến phiêu lưu khám phá “Null Safety in Kotlin” tại Cafedev. Chúng tôi hy vọng rằng bạn đã có những trải nghiệm bổ ích và hữu ích từ những kiến thức mà chúng tôi chia sẻ. Tại Cafedev, chúng tôi cam kết tiếp tục mang đến cho cộng đồng những thông tin hàng đầu và đa dạng nhất về lập trình và công nghệ. Hãy tiếp tục đón đọc để cùng Cafedev khám phá thêm nhiều chủ đề hấp dẫn khác trong thời gian sắp tới. Đừng quên theo dõi chúng tôi để không bỏ lỡ những bài viết mới nhất. Cảm ơn và hẹn gặp lại!”
Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của Cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!