Menu
Coddy logo textTech

Enum con metodi

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 88 di 110.

In Dart, gli enum non sono semplici elenchi di costanti: possono avere campi, costruttori e metodi, il che li rende potenti mini-classi. Questa funzionalità si chiama enum avanzati e consente di associare comportamento e dati direttamente a ogni valore dell'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
}

Ogni valore dell'enum chiama il costruttore con i propri argomenti specifici. Il costruttore deve essere const e tutti i campi devono essere final. Puoi aggiungere getter e metodi che operano sui dati dell'enum o li confrontano con altri valori.

Gli enum avanzati possono anche implementare interfacce, offrendo loro ancora più flessibilità:

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]
}

Gli enum avanzati sono ideali quando hai un insieme fisso di valori a cui associare dati o comportamenti, come codici di stato con messaggi, priorità con livelli o direzioni con coordinate.

challenge icon

Sfida

Facile

Costruiamo un sistema di gestione delle attività usando gli enum avanzati! Creerai un enum che rappresenta diverse categorie di attività, ciascuna con le proprie proprietà e comportamenti per aiutarti a organizzare e stabilire le priorità del lavoro.

Organizzerai il codice in due file:

  • task_category.dart: crea un enum avanzato chiamato TaskCategory che rappresenta diversi tipi di attività in un progetto. Ogni categoria dovrebbe avere:
    • Un campo String label per un nome leggibile
    • Un campo int priority (1 indica la priorità più alta, 3 quella più bassa)
    • Un costruttore const che inizializza entrambi i campi
    • Quattro valori enum: bug (etichetta: "Bug Fix", priorità: 1), feature (etichetta: "New Feature", priorità: 2), documentation (etichetta: "Documentation", priorità: 3) e testing (etichetta: "Testing", priorità: 2)
    • Un getter isUrgent che restituisce true se la priorità è 1
    • Un metodo describe() che restituisce una stringa nel formato: [label] (Priority: [priority])
    Il tuo enum dovrebbe anche implementare Comparable<TaskCategory>, così le attività possono essere ordinate per priorità (il numero di priorità più basso viene prima).
  • main.dart: importa il tuo enum delle categorie di attività e mostrane le funzionalità:
    • Crea un elenco contenente tutte e quattro le categorie di attività in questo ordine: feature, bug, documentation, testing
    • Stampa la descrizione di ogni categoria usando il metodo describe(), una per riga
    • Stampa una riga vuota
    • Ordina l'elenco per priorità e stampa After sorting by priority:
    • Stampa l'etichetta di ogni categoria ordinata, una per riga
    • Stampa una riga vuota
    • Stampa Urgent tasks:
    • Scorri l'ordine originale (feature, bug, documentation, testing) e stampa solo le etichette delle categorie per cui isUrgent è true

Questa sfida combina le funzionalità degli enum avanzati: campi, costruttori, getter, metodi e implementazione di interfacce, che lavorano insieme per creare un utile sistema di categorizzazione delle attività!

Output previsto:

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

Provalo tu

import 'task_category.dart';

void main() {
  // TODO: Crea una lista contenente tutte e quattro le categorie di attività in questo ordine:
  // feature, bug, documentation, testing
  
  // TODO: Stampa la descrizione di ogni categoria usando describe(), una per riga
  
  // TODO: Stampa una riga vuota
  
  // TODO: Ordina la lista per priorità
  
  // TODO: Stampa "After sorting by priority:"
  
  // TODO: Stampa l'etichetta di ogni categoria ordinata, una per riga
  
  // TODO: Stampa una riga vuota
  
  // TODO: Stampa "Urgent tasks:"
  
  // TODO: Scorri l'ordine originale (feature, bug, documentation, testing)
  // e stampa solo le etichette delle categorie per cui isUrgent è true
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online