Trong Dart, final
và const
đề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ả final
và const
đề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ếnfinal
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ếnconst
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ếnfinal
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ếnconst
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ụngfinal
trongclass
vàconstructor
để tạo ra các biến không thay đổi.const
:const
chỉ có thể được sử dụng trongclass
vàconstructor
nếu nó tham chiếu đến các biếnconst
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ạoList
vàmap
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};
Bình luận