Item 34: Use enums em vez de constantes int
Tags: java, enums, development, javaefetivo
Published: 2024-06-12 19:42:26

**No uso de Constantes temos**

**Prefixação para evitar conflitos:**
Prefixos como APPLE_ e ORANGE_ são usados porque Java não fornece namespaces para grupos de enum int, prevenindo conflitos quando duas enums têm constantes com nomes idênticos.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3l9xsn77qkvi8gum3jg.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8rpdt11mm3y4lq76c61h.jpg)

Veja como Enums é em sua forma mais simples:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/naow6pl9c9o8plzi1jmp.jpg)


**Instabilidade dos enum int:**
Os valores int das enums são compilados dentro dos clientes que os utilizam. Modificar esses valores requer recompilação dos clientes para evitar comportamentos errados.


**Limitações dos enum int e enum string:**
enum int: Difícil de traduzir para strings imprimíveis e iterar sobre suas constantes.

**enum string:**
Facilita a codificação direta de strings constantes, propensa a erros de digitação não detectados em tempo de compilação e problemas de desempenho devido à comparação de strings.

**Vantagens dos tipos enum do Java:**
São classes completas, mais poderosas que suas contrapartes em outras linguagens.
Garantem segurança de tipo em tempo de compilação.
Cada tipo enum tem seu próprio namespace, evitando conflitos de nomes idênticos.
Possibilidade de adicionar métodos, campos e implementar interfaces.
Constantes enum são finais e imutáveis.

**Exemplo de tipo enum:**
Enumeração de planetas com massa e raio como parâmetros.
Método surfaceWeight calcula o peso na superfície de cada planeta.
Utiliza método values para iterar sobre as constantes.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5mho7n298g779v910ey.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xszruj8885ze3z1zftfe.jpg)

Impressão:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e1nztbjqwuo3fm4dwdxb.jpg)

**Manutenção e evolução:**
Remover elementos de um tipo enum causa erros de compilação ou exceções úteis em tempo de execução.
Métodos privados ou package-private para comportamentos usados internamente.

**Enums aninhados e comportamentos específicos:**

- Enum PayrollDay usa um enum aninhado privado para calcular pagamento de horas extras.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t6ff09kx44nrpalmdkza.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsu3lwa39g32n6e9hfas.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oe8bb0ywzdgif3eqrpfm.jpg)

- Evita comandos switch dentro de enums para implementar comportamentos específicos.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/conv8zvk50mn2omfyv4w.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ue8u7qtdi4dkdq3qznbj.jpg)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jr8qoy73uuo7kbn0cnej.jpg)

**Boas práticas:**
Use enums sempre que precisar de um conjunto de constantes conhecidas em tempo de compilação.
Considere métodos específicos para constantes ao invés de switch em enums para comportamentos distintos.
Enums são preferíveis às constantes int por serem mais legíveis, seguras e poderosas.

Em resumo, os tipos enum do Java são mais legíveis, seguros e versáteis que as alternativas baseadas em int ou string, com vantagens significativas em termos de manutenção e evolução de código.