Menu
CoddyTech

Toán tử xử lý null

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

Ngoài ?. và !, Dart còn cung cấp các toán tử khác giúp bạn làm việc với giá trị có thể null một cách ngắn gọn hơn. Các toán tử nhận biết null này giúp bạn viết code gọn gàng hơn khi xử lý những giá trị có thể là null.

Toán tử kết hợp null ?? trả về giá trị bên trái nếu giá trị đó không phải là null, nếu không thì trả về giá trị bên phải:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

Toán tử gán nhận biết null ??= chỉ gán giá trị nếu biến hiện đang là null:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // Vẫn là Anonymous (không phải null)

Bạn có thể nối toán tử truy cập có xử lý giá trị null ?. để truy cập các thuộc tính lồng nhau:

String? city = user?.address?.city;  // Vẫn an toàn ngay cả khi user hoặc address là null

Các toán tử này kết hợp với nhau rất hiệu quả. Ví dụ, bạn có thể truy cập một thuộc tính có thể nhận giá trị null và cung cấp giá trị mặc định:

String greeting = user?.name ?? 'Stranger';
// Nếu user là null HOẶC user.name là null, dùng 'Stranger'

Sử dụng các toán tử này giúp code của bạn dễ đọc mà vẫn đảm bảo an toàn với giá trị null trong toàn bộ chương trình.

challenge icon

Thử thách

Dễ

Hãy xây dựng hệ thống đăng ký khách để tìm hiểu cách các toán tử nhận biết giá trị null giúp code gọn gàng hơn khi xử lý thông tin không bắt buộc.

Bạn sẽ sắp xếp code vào hai tệp:

  • guest.dart: Định nghĩa lớp Guest đại diện cho người tham dự một sự kiện. Một số khách cung cấp đầy đủ thông tin, còn những người khác chỉ cung cấp thông tin cơ bản. Lớp của bạn cần có:
    • String name không thể nhận giá trị null, mọi khách đều phải có tên
    • String? email có thể nhận giá trị null, không phải ai cũng cung cấp email
    • String? dietaryPreference có thể nhận giá trị null, một số khách không nêu yêu cầu về chế độ ăn
    • Một hàm khởi tạo nhận name làm tham số bắt buộc
    • Một phương thức getDisplayEmail() trả về email nếu có, hoặc 'No email provided' bằng toán tử ??
    • Một phương thức assignDefaultDiet() đặt dietaryPreference thành 'Standard' chỉ khi giá trị hiện tại là null, bằng toán tử ??=
    • Một phương thức getEmailDomain() trả về độ dài email bằng ?., hoặc null nếu không có email
    • Một phương thức printBadge() in thông tin thẻ của khách
  • main.dart: Nhập lớp khách của bạn và đăng ký ba khách với lượng thông tin khác nhau:
    • Tạo một khách tên 'Alice', đặt email của cô ấy thành 'alice@company.com' và sở thích ăn uống thành 'Vegetarian'
    • Tạo một khách tên 'Bob', chỉ đặt email của anh ấy thành 'bob@email.org' (để sở thích ăn uống là null)
    • Tạo một khách tên 'Charlie' (để cả email và sở thích ăn uống là null)
    • Gọi assignDefaultDiet() cho cả ba khách
    • Lần lượt với từng khách, gọi printBadge(), sau đó in Email length: [result] bằng getEmailDomain()

Phương thức printBadge() cần in theo định dạng này:

=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]

Lưu ý rằng sở thích ăn uống của Alice vẫn là 'Vegetarian' vì ??= chỉ gán giá trị khi giá trị hiện tại là null, còn Bob và Charlie được gán chế độ ăn mặc định 'Standard'.

Đầu ra dự kiến:

=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: null

Tự làm thử

import 'guest.dart';

void main() {
  // TODO: Tạo một khách tên 'Alice'
  // Đặt email của cô ấy thành 'alice@company.com'
  // Đặt chế độ ăn của cô ấy thành 'Vegetarian'

  // TODO: Tạo một khách tên 'Bob'
  // Chỉ đặt email của anh ấy thành 'bob@email.org'
  // Giữ chế độ ăn là null

  // TODO: Tạo một khách tên 'Charlie'
  // Giữ cả email và chế độ ăn là null

  // TODO: Gọi assignDefaultDiet() cho cả ba khách

  // TODO: Với từng khách theo thứ tự (Alice, Bob, Charlie):
  // - Gọi printBadge()
  // - In ra 'Email length: [result]' bằng getEmailDomain()
}
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: Trình biên dịch Dart online