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.
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 llamadoTaskCategoryque represente diferentes tipos de tareas en un proyecto. Cada categoría debe tener:- Un campo
String labelpara un nombre legible por humanos - Un campo
int priority(1 siendo la prioridad más alta, 3 la más baja) - Un constructor
constque inicialice ambos campos - Cuatro valores de enum:
bug(label: "Bug Fix", priority: 1),feature(label: "New Feature", priority: 2),documentation(label: "Documentation", priority: 3), ytesting(label: "Testing", priority: 2) - Un getter
isUrgentque devuelvatruesi la prioridad es 1 - Un método
describe()que devuelva un string en el formato:[label] (Priority: [priority])
Comparable<TaskCategory>para que las tareas puedan ordenarse por prioridad (menor número de prioridad = va primero).- Un campo
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 dondeisUrgentsea true
- Crea una lista que contenga las cuatro categorías de tareas en este orden:
¡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 FixHoja 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
}
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
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico13Conceptos avanzados de POO
Composición vs. HerenciaMétodos de extensiónClases invocablesClases selladas (Dart 3)Records (Dart 3)Patrones y coincidencia (3.0)Enums con métodos2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository