1. Histórico de como enum
surgiu
Hoje vamos explorar outro tipo de dado em Java: enum
. O nome enum
vem da palavra enumeração . O que é esse tipo de dados e para que serve?
Às vezes, um programador precisa criar um novo tipo de dado, cujos valores possíveis são limitados a uma pequena lista fixa.
Por exemplo, um DayOfTheWeek
tipo só pode receber os valores MONDAY
, TUESDAY
, WEDNESDAY
, ... Existem 7 valores no total. Ou um Month
tipo só pode receber apenas os valores JANUARY
, FEBRUARY
, MARCH
, ... São 12 valores no total.
Claro, você pode usar números (o int
tipo): 1
— Monday, 2
— Tuesday, etc. Mas alguém pode acidentalmente atribuir valores inválidos como 8
ou 0
à sua variável.
Você poderia facilmente ter uma situação em que um programador pensa que os dias da semana (ou meses do ano) são numerados começando em zero, enquanto outros esperam que sua numeração comece em um, etc.
É por isso que Java introduziu enum
, um tipo de dados que consiste em um conjunto finito de valores .
2. Declarando um tipo
A declaração de um novo enum
tipo de dados se parece com isto:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Onde TypeName
está o nome do novo tipo (classe), e os possíveis valores são separados por vírgulas e colocados entre chaves: Value1
, Value2
, Value3
.
Como exemplo, vamos criar o nosso próprio DayOfTheWeek
enum
:
Código | Observação |
---|---|
|
Novo Day tipo Segunda Terça Quarta Quinta Sexta Sábado Domingo |
Aqui está como você atribui um valor a uma variável do nosso novo tipo:
Day day = Day.MONDAY;
Exemplo:
Código | Observação |
---|---|
|
A saída da tela será:
|
3. Métodos de umenum
Um enum
tipo tem vários métodos embutidos, dois dos quais são muito interessantes:
O método estático values()
retorna uma matriz de todos os valores do enum
tipo:
Código | Observação |
---|---|
|
A days variável armazena um array contendo os valores do Day tipo (7 elementos) Exiba o conteúdo do array na tela:
|
O ordinal()
método retorna o número ordinal da constante. Você o chama em um enum
valor em vez de uma enum
classe:
Código | Saída do console |
---|---|
|
|
4. Convertendo para uma classe
Na realidade, não há nada de mágico aqui. O compilador apenas nos deu um pouco de açúcar sintático. Em tempo de compilação, o Day
enum é convertido em uma classe comum:
Código, versão simplificada | Observação |
---|---|
|
Day class Lista de constantes estáticas Um array com todos os valores do Day enum Uma variável que armazena o valor de um Day objeto específico A Day classe constructor é privada, o que significa que os objetos da Day classe só podem ser criados dentro da Day classe. O ordinal método deve ser chamado em um Day objeto. Ele retorna o valor do objeto — o value campo. O método retorna um array estático com todos os valores da Day classe |
Se removermos todos os métodos e variáveis estáticos da Day
classe, obteremos o seguinte:
Código | Observação |
---|---|
|
A value variável armazena o valor do Day objeto Day objetos só podem ser criados dentro da Day classe, desde que o construtor seja private . O ordinal() método retorna o valor value do Day objeto. |
Em outras palavras, nada assustador está acontecendo aqui. O compilador cria a Day
classe, adiciona as constantes que representam os enum
valores, adiciona os métodos necessários e torna o construtor da classe private
. Veremos como os construtores funcionam um pouco mais tarde.
Felizmente, agora está claro por que atribuímos um valor a uma variável dessa maneira:
Day day = Day.MONDAY;
MONDAY
é apenas um campo estático (constante) na Day
classe. Ao acessar métodos e campos estáticos de fora da classe, você deve indicar o nome da classe antes do nome do campo ou método.
5. Mais métodos de umenum
Cada enum
classe tem vários recursos interessantes.
Convertendo de e para uma string
Para converter um objeto enum em uma string, você precisa chamar seu toString()
método.
String str = Day.MONDAY.toString();
Para converter na outra direção (de uma string para um Day
objeto), você pode usar o valueOf()
método estático:
Day day = Day.valueOf("MONDAY");
É super conveniente e será útil em muitos casos.
Convertendo para um número e vice-versa
Você já sabe como converter um enum
objeto em um número: chame o ordinal()
método:
int index = Day.MONDAY.ordinal();
Para converter na outra direção (de um número para um Day
objeto), você precisa de uma construção mais transparente:
Day day = Day.values()[2];
Exemplos:
Código | Observação |
---|---|
|
Segunda-feira Obtenha o índice de segunda-feira: 0 Dia da semana 2 dias após segunda-feira |
Ponto importante: como enum
os valores são um conjunto fixo de constantes, eles podem ser comparados usando == . Em outras palavras, você não pode ter dois MONDAY
objetos idênticos com endereços diferentes. Existe apenas uma única instância de cada valor de enumeração. E isso significa que comparar variáveis enum usando == sempre funcionará.
6. Adicionando seus próprios métodos a umenum
Como an enum
se torna uma classe comum em tempo de compilação, você pode declarar métodos nela. Esses métodos são simplesmente adicionados à classe que o compilador gera. Por exemplo, suponha que queremos Day enum
retornar uma lista dos valores de enumeração em vez de uma matriz.
Então podemos adicionar o seguinte código:
Código | Observação |
---|---|
|
Um ponto e vírgula é necessário após a lista de valores. Crie um ArrayList objeto Adicione os valores no array retornado pelo values() método. Devolva a lista. |
Agora este método pode ser chamado no código:
Código | Observação |
---|---|
|
A list variável armazenará uma lista de todos os valores do arquivo Day enum . |
GO TO FULL VERSION