¿Cómo puedo construir una enumeración con Dart?

El lenguaje Dart no tiene enumeraciones (¿aún?). ¿Cuál es la forma correcta o idiomática de construir una enumeración, al menos hasta que llegue una función de idioma?

Con r41815 Dart tiene soporte nativo de Enum, vea http://dartbug.com/21416 y puede usarse como

enum Status { none, running, stopped, paused } void main() { print(Status.values); Status.values.forEach((v) => print('value: $v, index: ${v.index}')); print('running: ${Status.running}, ${Status.running.index}'); print('running index: ${Status.values[1]}'); } 

[Status.none, Status.running, Status.stopped, Status.paused]
valor: Status.none, índice: 0
valor: Status.running, índice: 1
valor: Status.stopped, index: 2
valor: Status.paused, índice: 3
corriendo: Status.running, 1
índice en ejecución: estado.running

Una limitación es que no es posible establecer valores personalizados para un elemento enum, se numeran automáticamente.

Más detalles en este borrador https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Dart ahora tiene soporte para enumeraciones .

El rest de esta respuesta es para Dart <= 1.8. Si usa> 1.8, use el soporte formal de Dart para enumeraciones (explicado en otra respuesta).

Es cierto, el lenguaje Dart no (¿todavía?) Tiene enumeraciones. Hay un problema abierto para eso.

Mientras tanto, aquí hay un fragmento idiomático de Dart para crear tu propia enumeración.

 class Enum { final _value; const Enum._internal(this._value); toString() => 'Enum.$_value'; static const FOO = const Enum._internal('FOO'); static const BAR = const Enum._internal('BAR'); static const BAZ = const Enum._internal('BAZ'); } 

El uso de constructores const significa que puede usar esta enumeración en un interruptor. Aquí hay un ejemplo:

 class Fruits { final _value; const Fruits._internal(this._value); toString() => 'Enum.$_value'; static const APPLE = const Fruits._internal('APPLE'); static const PEAR = const Fruits._internal('PEAR'); static const BANANA = const Fruits._internal('BANANA'); } void main() { var yummy = Fruits.BANANA; switch (yummy) { case Fruits.APPLE: print('an apple a day'); break; case Fruits.PEAR: print('genus Pyrus in the family Rosaceae'); break; case Fruits.BANANA: print('open from the bottom, it is easier'); break; } } 

Utilizo una versión un poco más simple de la clase Enum en Dart Web Toolkit :

 /** * Emulation of Java Enum class. * * Example: * * class Meter extends Enum { * * const Meter(int val) : super (val); * * static const Meter HIGH = const Meter(100); * static const Meter MIDDLE = const Meter(50); * static const Meter LOW = const Meter(10); * } * * and usage: * * assert (Meter.HIGH, 100); * assert (Meter.HIGH is Meter); */ abstract class Enum { final T _value; const Enum(this._value); T get value => _value; } 

Me gustan las constantes de nivel superior para mis enums. Puede usar importaciones para arreglar cualquier colisión. Esto hace que el uso de las enumeraciones sea mucho menos detallado.

es decir

 if (m == high) {} 

en lugar de:

 if (m == Meter.high) {} 

Definición de Enum:

 class Meter extends Enum { const Meter(int val) : super (val); } const Meter high = const Meter(100); const Meter middle = const Meter(50); const Meter low = const Meter(10);