Trong Dart, finalconst đều là các từ khóa được sử dụng để khai báo biến không thay đổi (immutable), nhưng chúng có những điểm giống, khác nhau quan trọng:

final:

  • Biến được gán giá trị sau khi khai báo và sau đó không thể thay đổi giá trị đó.
  • Giá trị của biến final có thể được tính toán trong runtime.
  • Không yêu cầu biến final phải được khởi tạo ngay khi khai báo.
  • Có thể khởi tạo biến final trong constructor của một lớp.
    Ví dụ về final:
void main() {
  final int x;
  x = 5; // Có thể gán giá trị sau khi khai báo
  print(x); // In ra 5
}

const:

  • Biến được gán giá trị khi khai báo và giá trị đó phải là một giá trị hằng (constant) đã biết trong compile time.
  • Không thể thay đổi giá trị của biến const sau khi đã khai báo.
  • Có thể được sử dụng để tạo các giá trị hằng số, ví dụ như các giá trị literal (Number, String, boolean, …).

Ví dụ về const:


void main() {
  const int y = 10; // Biến y là một giá trị hằng số
  // y = 20; // Lỗi: Không thể thay đổi giá trị của biến const
  print(y); // In ra 10
}

Giống nhau:

Cả finalconst đều tạo ra biến không thay đổi, có nghĩa rằng bạn không thể thay đổi giá trị của chúng sau khi chúng đã được gán.

Khác nhau:

1. Thời điểm gán giá trị:

  • final: Biến final có thể được gán giá trị sau khi nó được khai báo, và giá trị có thể tính toán khi chạy.
  • const: Biến const phải được gán giá trị tại thời điểm khai báo và giá trị này phải là một hằng số biết trước khi chạy (compile-time constant).
    Ví dụ:
final int x = 10; // Gán giá trị cho biến final sau khi khai báo
const int y = 20; // Khai báo và gán giá trị cho biến const cùng lúc

2. Môi trường gán giá trị:

  • final: Giá trị của biến final có thể thay đổi tùy theo logic của chương trình, và bạn có thể gán giá trị sau khi khai báo.
  • const: Giá trị của biến const phải là một hằng số biết trước khi chạy, nghĩa là bạn không thể tính toán giá trị của nó dựa trên logic chương trình.
    Ví dụ:
final int z = someFunction(); // Hợp lệ, giá trị được tính toán khi gán
const int w = someFunction(); // Không hợp lệ, giá trị không biết trước khi chạy

3. Sử dụng trong class và constructor:

  • final: Bạn có thể sử dụng final trong classconstructor để tạo ra các biến không thay đổi.
  • const: const chỉ có thể được sử dụng trong classconstructor nếu nó tham chiếu đến các biến const hoặc các giá trị được xem là hằng số biết trước khi chạy.
    Ví dụ:
class MyClass {
  final int x;
  const MyClass(this.x);
}

4. Sử dụng trong danh sách và map:

  • const được sử dụng để tạoListmap hằng số biết trước khi chạy.
    Ví dụ:
const List<int> myList = [1, 2, 3];
const Map<String, int> myMap = {'one': 1, 'two': 2};

Tóm tắt,finalconst đều tạo ra biến không thay đổi, nhưng chúng khác nhau về thời điểm gán giá trị, môi trường gán giá trị, và cách chúng được sử dụng trong class, Listmap.