[Dart] enum (liệt kê)

[Dart] enum (liệt kê)

Cú pháp cơ bản của enum (liệt kê) trong Dart như sau:

enum TênEnum {
  giáTrị1,
  giáTrị2,
  giáTrị3,
  // ... các giá trị khác
}
Dart

Giải thích:

  • enum: Đây là từ khóa để bắt đầu định nghĩa một kiểu dữ liệu liệt kê.
  • TênEnum: Đây là tên bạn đặt cho kiểu liệt kê của mình. Theo quy ước, tên enum thường được viết bằng chữ hoa đầu mỗi từ (PascalCase), ví dụ: OrderStatus, Color, CompanyType.
  • { … }: Dấu ngoặc nhọn bao quanh các giá trị có thể có của enum.
  • giáTrị1, giáTrị2, giáTrị3, …: Đây là các hằng số (constants) đại diện cho các giá trị khác nhau mà biến thuộc kiểu TênEnum có thể nhận. Các giá trị này được phân tách bằng dấu phẩy. Theo quy ước, tên của các giá trị enum thường được viết bằng chữ hoa toàn bộ (UPPER_CASE) hoặc chữ hoa đầu mỗi từ (PascalCase), ví dụ: PENDING, SHIPPED, DELIVERED hoặc SoleProprietorship, Partnership.

Ví dụ cơ bản:

enum OrderStatus {
  pending,
  processing,
  shipped,
  delivered,
  cancelled,
}

void main() {
  OrderStatus currentStatus = OrderStatus.processing;
  print("Current order status: $currentStatus"); // Output: Current order status: OrderStatus.processing

  if (currentStatus == OrderStatus.shipped) {
    print("Your order has been shipped!");
  } else if (currentStatus == OrderStatus.delivered) {
    print("Your order has been delivered.");
  } else {
    print("Your order is still being processed.");
  }
}
Dart

Thêm thuộc tính và phương thức vào enum:

Enum trong Dart mạnh mẽ hơn nhiều ngôn ngữ khác vì bạn có thể thêm thuộc tính, constructor và phương thức vào chúng:

enum CompanyType {
  soleProprietorship("Sole Proprietorship", 1),
  partnership("Partnership", 2),
  corporation("Corporation", 3),
  limitedLiabilityCompany("Limited Liability Company", 4);

  final String text;
  final int value;

  const CompanyType(this.text, this.value);

  String get displayText => text.toUpperCase();

  void printValue() {
    print("Value of $name: $value");
  }
}

void main() {
  CompanyType company = CompanyType.partnership;
  print(company.text);           // Output: Partnership
  print(company.value);          // Output: 2
  print(company.displayText);    // Output: PARTNERSHIP
  company.printValue();        // Output: Value of partnership: 2

  print(CompanyType.values);     // Output: [CompanyType.soleProprietorship, CompanyType.partnership, CompanyType.corporation, CompanyType.limitedLiabilityCompany]
  print(CompanyType.values[0]);  // Output: CompanyType.soleProprietorship
  print(CompanyType.soleProprietorship.index); // Output: 0 (vị trí theo thứ tự khai báo)
}
Dart

Giải thích ví dụ nâng cao:

  • Mỗi giá trị enum giờ đây được liên kết với một chuỗi text và một số nguyên value thông qua constructor CompanyType(this.text, this.value). Lưu ý việc sử dụng const cho constructor của enum.
  • displayText là một getter (một loại phương thức chỉ đọc) trả về phiên bản chữ hoa của text.
  • printValue() là một phương thức thông thường in ra tên của giá trị enum và thuộc tính value của nó.
  • CompanyType.values trả về một List chứa tất cả các giá trị của enum theo thứ tự khai báo.
  • .index là một thuộc tính tự động có sẵn cho mỗi giá trị enum, trả về vị trí của nó (bắt đầu từ 0).

Về cú pháp enum trong Dart! Sở dĩ bạn thấy các giá trị enum được phân tách bằng dấu phẩy và sau đó kết thúc bằng dấu chấm phẩy (;) là vì phần thân của enum (nơi bạn định nghĩa các thuộc tính và phương thức) được coi như là phần thân của một lớp.

Hãy xem xét cấu trúc của một lớp thông thường trong Dart:

class MyClass {
  // Thuộc tính
  String? name;

  // Constructor
  MyClass(this.name);

  // Phương thức
  void printName() {
    print(name);
  }
}
Dart

Bạn thấy rằng các thành viên của lớp (thuộc tính, constructor, phương thức) được định nghĩa bên trong dấu ngoặc nhọn {}.

Enum trong Dart hoạt động tương tự:

Khi bạn định nghĩa một enum với các thuộc tính và phương thức kèm theo, Dart coi phần sau các giá trị enum (vẫn nằm trong dấu ngoặc nhọn {}) như là phần thân của một lớp đặc biệt. Các giá trị enum (soleProprietorship, partnership, v.v.) có thể được xem như là các thể hiện (instances) hằng số của lớp CompanyType.

Do đó, sau khi bạn liệt kê tất cả các giá trị enum được phân tách bằng dấu phẩy, nếu bạn muốn định nghĩa thêm các thành viên (thuộc tính, constructor, phương thức) cho enum, bạn cần kết thúc danh sách các giá trị bằng dấu chấm phẩy (;) để báo hiệu sự kết thúc của phần liệt kê các hằng số enum và bắt đầu phần định nghĩa các thành viên của “lớp enum” đó.

So sánh:

// Enum có thuộc tính và phương thức
enum CompanyType {
  soleProprietorship("Sole Proprietorship", 1),
  partnership("Partnership", 2),
  corporation("Corporation", 3),
  limitedLiabilityCompany("Limited Liability Company", 4); // Kết thúc danh sách giá trị bằng dấu chấm phẩy

  final String text;
  final int value;

  const CompanyType(this.text, this.value);

  String get displayText => text.toUpperCase();

  void printValue() {
    print("Value of $name: $value");
  }
}

// Enum đơn giản (không có thuộc tính hoặc phương thức bổ sung)
enum SimpleColor {
  red,
  green,
  blue
}
Dart

Trong SimpleColor, bạn không cần dấu chấm phẩy ở cuối vì không có thêm thành viên nào được định nghĩa sau các giá trị enum.

Tóm lại:

  • Dấu phẩy (,) được sử dụng để phân tách các giá trị khác nhau của enum.
  • Dấu chấm phẩy (;) được sử dụng để kết thúc danh sách các giá trị enum và bắt đầu phần định nghĩa các thành viên (thuộc tính, constructor, phương thức) của enum, tương tự như cách bạn định nghĩa các thành viên trong một lớp thông thường. Nếu enum không có thêm thành viên nào, dấu chấm phẩy ở cuối là không bắt buộc (nhưng vẫn hợp lệ).

Đây là một thiết kế ngôn ngữ của Dart để cho phép enum có khả năng mạnh mẽ hơn bằng cách hỗ trợ các thành viên giống như một lớp.

Những điểm cần lưu ý về enum trong Dart:

  • Enum là một cách tuyệt vời để biểu diễn một tập hợp hữu hạn các giá trị có ý nghĩa.
  • Các giá trị enum là các hằng số.
  • Bạn có thể thêm thuộc tính, constructor (phải là const), và phương thức vào enum.
  • Dart cung cấp thuộc tính .index và static property .values cho enum.
  • Enum giúp code của bạn trở nên dễ đọc, an toàn kiểu dữ liệu và dễ bảo trì hơn so với việc sử dụng các hằng số thông thường (ví dụ: static const String).

Hy vọng cú pháp và các ví dụ này giúp bạn hiểu rõ hơn về cách sử dụng enum trong Dart!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *