Kauê Martins
Kauê Martins

Follow

Kauê Martins

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

Agora sim, o grande ganho do enum no Dart 2.17

Que tal usufruirmos de todas as novas possibilidades 😏

Kauê Martins's photo
Kauê Martins
·Jul 8, 2022·

2 min read

Como mencionado no artigo anterior, 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 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 🥲
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 😆
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:
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:
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:
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 🤗

Did you find this article valuable?

Support Kauê Martins by becoming a sponsor. Any amount is appreciated!

See recent sponsors Learn more about Hashnode Sponsors
 
Share this