Menu
Coddy logo textTech

Enums con métodos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 88 de 110.

En Dart, los enums no son solo simples listas de constantes —pueden tener campos, constructores y métodos, convirtiéndolos en potentes mini-clases. Esto se llama enums mejorados, y te permite adjuntar comportamiento y datos directamente a cada valor del enum.

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

void main() {
  var status = Status.pending;
  print(status.displayName);    // Waiting
  print(status.isFinalized);    // false
  
  print(Status.approved.isFinalized);  // true
}

Cada valor de enum llama al constructor con sus argumentos específicos. El constructor debe ser const, y todos los campos deben ser final. Puedes añadir getters y métodos que trabajen con los datos del enum o comparen contra otros valores.

Los enums mejorados también pueden implementar interfaces, dándoles aún más flexibilidad:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

void main() {
  var tasks = [Priority.high, Priority.low, Priority.medium];
  tasks.sort();
  print(tasks);  // [Priority.low, Priority.medium, Priority.high]
}

Los enums mejorados son ideales cuando se tiene un conjunto fijo de valores que necesitan datos o comportamientos asociados, como códigos de estado con mensajes, prioridades con niveles o direcciones con coordenadas.

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de gestión de tareas utilizando enums mejorados! Crearás un enum que represente diferentes categorías de tareas, cada una con sus propias propiedades y comportamientos que ayudan a organizar y priorizar el trabajo.

Organizarás tu código en dos archivos:

  • task_category.dart: Crea un enum mejorado llamado TaskCategory que represente diferentes tipos de tareas en un proyecto. Cada categoría debe tener:
    • Un campo String label para un nombre legible por humanos
    • Un campo int priority (1 siendo la prioridad más alta, 3 la más baja)
    • Un constructor const que inicialice ambos campos
    • Cuatro valores de enum: bug (label: "Bug Fix", priority: 1), feature (label: "New Feature", priority: 2), documentation (label: "Documentation", priority: 3), y testing (label: "Testing", priority: 2)
    • Un getter isUrgent que devuelva true si la prioridad es 1
    • Un método describe() que devuelva un string en el formato: [label] (Priority: [priority])
    Tu enum también debe implementar Comparable<TaskCategory> para que las tareas puedan ordenarse por prioridad (menor número de prioridad = va primero).
  • main.dart: Importa tu enum de categoría de tarea y demuestra sus capacidades:
    • Crea una lista que contenga las cuatro categorías de tareas en este orden: feature, bug, documentation, testing
    • Imprime la descripción de cada categoría usando el método describe(), una por línea
    • Imprime una línea vacía
    • Ordena la lista por prioridad e imprime After sorting by priority:
    • Imprime el label de cada categoría ordenada, uno por línea
    • Imprime una línea vacía
    • Imprime Urgent tasks:
    • Recorre el orden original (feature, bug, documentation, testing) e imprime solo los labels de las categorías donde isUrgent sea true

¡Este desafío combina características de enums mejorados: campos, constructores, getters, métodos e implementación de interfaces, todo trabajando en conjunto para crear un sistema de categorización de tareas útil!

Salida esperada:

New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)

After sorting by priority:
Bug Fix
New Feature
Testing
Documentation

Urgent tasks:
Bug Fix

Hoja de referencia

Los enums mejorados en Dart pueden tener campos, constructores y métodos, lo que los convierte en potentes mini-clases que adjuntan comportamiento y datos a cada valor del enum.

Enum mejorado básico con campos y constructor:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
}

Requisitos clave:

  • El constructor debe ser const
  • Todos los campos deben ser final
  • Cada valor del enum llama al constructor con argumentos específicos

Los enums mejorados pueden incluir getters y métodos:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

Los enums mejorados pueden implementar interfaces como Comparable:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

Utilice enums mejorados cuando tenga un conjunto fijo de valores que necesiten datos o comportamientos asociados.

Pruébalo tú mismo

import 'task_category.dart';

void main() {
  // TODO: Crear una lista que contenga las cuatro categorías de tareas en este orden:
  // feature, bug, documentation, testing
  
  // TODO: Imprimir la descripción de cada categoría usando describe(), una por línea
  
  // TODO: Imprimir una línea vacía
  
  // TODO: Ordenar la lista por priority
  
  // TODO: Imprimir "After sorting by priority:"
  
  // TODO: Imprimir la etiqueta de cada categoría ordenada, una por línea
  
  // TODO: Imprimir una línea vacía
  
  // TODO: Imprimir "Urgent tasks:"
  
  // TODO: Recorrer el orden original (feature, bug, documentation, testing)
  // y mostrar solo las etiquetas de las categorías donde isUrgent sea true
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos