# Agora sim, o grande ganho do enum no Dart 2.17


Como mencionado no [artigo anterior](https://kmartins.dev/enum-no-dart-215), não era possível declarar **membros** nos nossos `enums` e de certa forma vários `devs` ficavam chateados(as) e magoados(as) 😤

Mas para nossa alegria, isso finalmente mudou, fique tranquilo(a), você não leu errado, melhoria implementa e [issue](https://github.com/dart-lang/language/issues/158) fechada _(oiá até rimou 🤪)_.

Vai, bora dar aquele **refactor** em um código que está usando uma `extensions`!? Eu sei que você quer, então só vamos...

- Versão que causa certa tristeza ao olhar 🥲

```dart
enum Transport { car, truck, airplane, train, boat }

extension TransportExt on Transport {
  int getSpeed() {
    switch (this) {
      case Transport.car:
        return 65;
      case Transport.truck:
        return 55;
      case Transport.airplane:
        return 600;
      case Transport.train:
        return 70;
      case Transport.boat:
        return 22;
    }
  }
}
```

_Fique tranquilo, você ainda pode fazer assim_ 😮‍💨

- Versão que causa alegria ao olhar 😆

```dart
enum Transport {
  car(65),
  truck(55),
  airplane(600),
  train(70),
  boat(22);

  final int _speed;
  const Transport(this._speed);

  int getSpeed() => _speed;
}
```

Como algo "simples" pode deixar tanto(a) `dev` feliz não é mesmo 💁🏽‍♀️

Ei, calma que só melhora, há mais coisas que vão te dar uma "explosão" de felicidade 🥳

- Use com `generics`:

```dart
enum Transport<T extends num> {
  car<int>(65),
  truck<int>(55),
  airplane<double>(600.50),
  train<num>(70.25),
  boat(22); // A inferência do tipo também funciona ;)

  final T _speed;
  const Transport(this._speed);

  T getSpeed() => _speed;
}
```

- Adicione `mixins` e implemente `interfaces`:

```dart
mixin Speedometer {
  // int speed = 0; Se usado no enum, deve ser final  
  int get maxSpeed;
}

abstract class Validation {
 bool isValidSpeed(int speed);
}

enum Transport with Speedometer implements Validation {
  ...
  const Transport(this.maxSpeed);

  @override
  final int maxSpeed;

  @override
  bool isValidSpeed(int speed) => speed <= maxSpeed;
}
```

- Faça `Factory constructors`:

```dart
enum Transport {
  ...
  const Transport(this.speed);

  factory Transport.faster() => Transport.airplane;

  factory Transport.slower() => Transport.boat;
}
```

_Só não se esqueça, o `enum` continua sendo uma **constante**, você não pode **estender** dele, **sobrescrever** o `index`, `hashCode`, o operador `==` e nem se quer pensar em **declarar um membro** chamado `values`_ 😉

Sobre essa melhoria, deixo a seguinte frase do qual não sei o seu autor(a):
>_"Não existe começo perfeito, a evolução é um processo."_

**Reflitamos** 🤔

Se chegou até aqui, não fique acanhado(a), deixe aquele **like**, **compartilha** com os(as) `devs` e **me segue** nas redes sociais 🍻

_Esqueci ou errei algo? Não hesite e me avise_ 🤗

### Links úteis

- [Dart Guide - enumerated-types](https://dart.dev/guides/language/language-tour#enumerated-types)
- [Stack Overflow - How do I add Methods or Values to Enums in Dart?](https://stackoverflow.com/a/71412047)
