Difference Between static, const, and final in Dart
Introduction
Dart provides three keywords—static
, const
, and final
—to define variables with specific behaviors. Understanding their differences helps in writing efficient and maintainable code. Let’s explore their characteristics and usage.
1. static
Definition: Declares a class-level variable or method shared across all instances of the class.
Key Characteristics:
- Belongs to the class, not an instance.
- Can be accessed using the class name.
- Memory is allocated only once.
class Counter {
static int count = 0; // Shared across all instances
void increment() {
count++;
}
}
void main() {
Counter c1 = Counter();
Counter c2 = Counter();
c1.increment();
c2.increment();
print(Counter.count); // Output: 2 (shared value)
}
2. const
Definition: Defines a compile-time constant. The value must be known at compile time and cannot be changed.
Key Characteristics:
- Immutable value known at compile time.
- Memory is allocated once and canonicalized.
void main() {
const int age = 30;
const pi = 3.14; // Type inference
// age = 31; // Error: Cannot assign a new value to const
const List numbers = [1, 2, 3];
// numbers.add(4); // Error: Cannot modify a const list
print(age); // Output: 30
print(pi); // Output: 3.14
}
3. final
Definition: Defines a runtime constant. The value is initialized once and cannot be reassigned, but it can be determined at runtime.
Key Characteristics:
- Immutable value initialized at runtime.
- Useful for properties whose values are only known at runtime.
void main() {
final DateTime currentTime = DateTime.now(); // Value assigned at runtime
print(currentTime);
// currentTime = DateTime.now(); // Error: Cannot reassign a final variable
}
Comparison: static
, const
, and final
Feature | static |
const |
final |
---|---|---|---|
Scope | Class-level (shared) | Local or global | Local or global |
Initialization | At runtime | At compile time | At runtime |
Immutability | Can be mutable | Immutable | Immutable |
Memory Allocation | Shared | One-time | One-time |
Access | Class name | Directly | Directly |
Combined Example
class Example {
static int staticVar = 100; // Shared variable
final int finalVar; // Instance-specific runtime constant
static const int staticConst = 200; // Compile-time constant
Example(this.finalVar);
}
void main() {
// Accessing static variable
print(Example.staticVar); // Output: 100
// Creating an instance
Example obj = Example(300);
print(obj.finalVar); // Output: 300
// Accessing static const
print(Example.staticConst); // Output: 200
}
Comments
Post a Comment