Pular para o conteúdo principal

Tipos enumerados

Aprenda sobre o tipo enum em Dart.

Tipos enumerados, frequentemente chamados de enumerações ou enums, são um tipo especial de classe usado para representar um número fixo de valores constantes.

Declarando enums simples

#

Para declarar um tipo enumerado simples, use a keyword enum e liste os valores que você deseja enumerar:

dart
enum Color { red, green, blue }

Declarando enums aprimorados

#

Dart também permite que declarações de enum declarem classes com campos, métodos e construtores const que são limitados a um número fixo de instâncias constantes conhecidas.

Para declarar um enum aprimorado, siga uma sintaxe semelhante à das classes normais, mas com alguns requisitos extras:

  • Variáveis de instância devem ser final, incluindo as adicionadas por mixins.
  • Todos os construtores generativos devem ser const.
  • Construtores factory só podem retornar uma das instâncias fixas e conhecidas do enum.
  • Nenhuma outra classe pode ser estendida, pois Enum é estendida automaticamente.
  • Não pode haver sobrescritas de index, hashCode ou do operador de igualdade ==.
  • Um membro chamado values não pode ser declarado em um enum, pois entraria em conflito com o getter estático values gerado automaticamente.
  • Todas as instâncias do enum devem ser declaradas no início da declaração, e deve haver pelo menos uma instância declarada.

Métodos de instância em um enum aprimorado podem usar this para referenciar o valor atual do enum.

Aqui está um exemplo que declara um enum aprimorado com múltiplas instâncias, variáveis de instância, getters e uma interface implementada:

dart
enum Vehicle implements Comparable<Vehicle> {
  car(tires: 4, passengers: 5, carbonPerKilometer: 400),
  bus(tires: 6, passengers: 50, carbonPerKilometer: 800),
  bicycle(tires: 2, passengers: 1, carbonPerKilometer: 0);
​
  const Vehicle({
    required this.tires,
    required this.passengers,
    required this.carbonPerKilometer,
  });
​
  final int tires;
  final int passengers;
  final int carbonPerKilometer;
​
  int get carbonFootprint => (carbonPerKilometer / passengers).round();
​
  bool get isTwoWheeled => this == Vehicle.bicycle;
​
  @override
  int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;
}

Usando enums

#

Acesse os valores enumerados como qualquer outra variável estática:

dart
final favoriteColor = Color.blue;
if (favoriteColor == Color.blue) {
  print('Your favorite color is blue!');
}

Cada valor em um enum tem um getter index, que retorna a posição, começando em zero, do valor na declaração do enum. Por exemplo, o primeiro valor tem índice 0, e o segundo valor tem índice 1.

dart
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);

Para obter uma lista com todos os valores enumerados, use a constante values do enum.

dart
List<Color> colors = Color.values;
assert(colors[2] == Color.blue);

Você pode usar enums em instruções switch, e receberá um aviso se não tratar todos os valores do enum:

dart
var aColor = Color.blue;
​
switch (aColor) {
  case Color.red:
    print('Red as roses!');
  case Color.green:
    print('Green as grass!');
  default: // Without this, you see a WARNING.
    print(aColor); // 'Color.blue'
}

Se você precisar acessar o nome de um valor enumerado, como 'blue' a partir de Color.blue, use a propriedade .name:

dart
print(Color.blue.name); // 'blue'

Você pode acessar um membro de um valor enum da mesma forma que faria com um objeto normal:

dart
print(Vehicle.car.carbonFootprint);

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.