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.

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, nullStringnull 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, nullStringnull 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!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!