Los enums en Dart ofrecen una manera estructurada y clara de definir un conjunto de valores constantes, mejorando la legibilidad y seguridad del código al reducir errores asociados con patrones tradicionales como el uso de cadenas o números mágicos. A continuación, exploramos usos avanzados de los enums en Dart para mostrar su flexibilidad y potencia.
1. Enum con valores asociados
Los enums en Dart pueden enriquecerse asociando valores con cada miembro del enum. Esto es útil cuando necesitas adjuntar metadatos a cada constante.
enum PriorityLevel {
low(1),
medium(2),
high(3);
final int level;
const PriorityLevel(this.level);
}
void main() {
var priority = PriorityLevel.high;
print('Nivel de prioridad: ${priority.level}'); // Output: Priority level: 3
}
En este ejemplo, cada miembro del enum tiene un valor entero asociado, lo que permite que el código mantenga datos estructurados con descripciones claras.
2. Enum con métodos
Los enums también pueden tener métodos, lo que los hace aún más potentes al encapsular la lógica relacionada con el enum en sí.
enum TrafficLight {
red,
yellow,
green;
String get action {
switch (this) {
case TrafficLight.red:
return 'Stop';
case TrafficLight.yellow:
return 'Precaución';
case TrafficLight.green:
return 'Pasar';
}
}
}
void main() {
var light = TrafficLight.red;
print('Acción: ${light.action}'); // Output: Action: Stop
}
Aquí, el enum TrafficLight
contiene un método action
que devuelve la acción correspondiente según el valor del enum. Este enfoque mantiene la lógica bien organizada junto con el enum.
3. Enum con declaraciones switch
Los enums suelen utilizarse junto con declaraciones switch
, lo que proporciona una manera clara y concisa de manejar diferentes valores de enum.
enum DeviceStatus { on, off, standby }
void handleDevice(DeviceStatus status) {
switch (status) {
case DeviceStatus.on:
print('El dispositivo está funcionando.');
break;
case DeviceStatus.off:
print('El dispositivo está apagado.');
break;
case DeviceStatus.standby:
print('El dispositivo está en modo de espera.');
break;
}
}
void main() {
handleDevice(DeviceStatus.on); // Output: Device is running.
}
El uso de enums con switch
asegura que se manejen todos los casos posibles, reduciendo errores causados por estados no tratados.
4. Extensiones en Enums (Dart >= 2.7)
Dart permite añadir extensiones a los enums, lo que resulta útil para mantener tu código modular y agregar funcionalidad extra sin modificar la definición original del enum.
enum Direction { north, east, south, west }
extension DirectionHelper on Direction {
bool get isVertical => this == Direction.north || this == Direction.south;
bool get isHorizontal => this == Direction.east || this == Direction.west;
}
void main() {
print(Direction.north.isVertical); // Output: true
print(Direction.east.isHorizontal); // Output: true
}
Al usar extensiones, puedes agregar métodos adicionales como isVertical
e isHorizontal
al enum Direction
, haciendo el código más legible y extensible.
5. Iterar sobre Enums
Los enums en Dart tienen una propiedad values
incorporada, que contiene todos los valores posibles del enum. Esto permite iterar fácilmente sobre ellos.
enum AccessLevel { guest, user, admin }
void main() {
for (var level in AccessLevel.values) {
print('Nivel de acceso: $level');
}
}
Visita mi sitio web Para acceder a mi GITHUB: albertoguaman.com
Esto es particularmente útil cuando trabajas con un conjunto fijo de opciones, evitando la necesidad de manejar manualmente cada caso.
Conclusión
Los enums avanzados en Dart permiten a los desarrolladores crear un código más limpio y mantenible al encapsular valores, métodos y lógica dentro del propio enum. Ya sea que estés definiendo niveles de prioridad, gestionando estados o añadiendo métodos mediante extensiones, los enums hacen que tu código sea más robusto y menos propenso a errores.