Enum em Java
Além dos tipos primitivos e das classes, o Java possui um tipo especial chamado enum (enumeration).
Um enum
representa um conjunto de constantes nomeadas logicamente relacionadas.
A declaração de um enum
é feita com a palavra-chave enum
, seguida do nome e da lista de constantes separadas por vírgulas.
enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
Um enum
define um novo tipo. É possível criar variáveis desse tipo e atribuir valores que estejam entre as constantes declaradas:
public class Program {
public static void main(String[] args) {
Day current = Day.MONDAY;
System.out.println(current); // MONDAY
}
}
Uso em Classes
enum
pode ser usado como tipo de campo em uma classe:
public class Program {
public static void main(String[] args) {
Book b1 = new Book("War and Peace", "L. Tolstoy", Type.BELLETRISTIC);
System.out.printf("Book '%s' has a type %s%n", b1.name, b1.getType());
}
}
class Book {
private Type bookType;
String name;
String author;
Book(String name, String author, Type type) {
this.bookType = type;
this.name = name;
this.author = author;
}
String getType() {
switch (bookType) {
case BELLETRISTIC: return "Belletristic";
case SCIENCE: return "Science";
case SCIENCE_FICTION: return "Science fiction";
case PHANTASY: return "Phantasy";
default: return "Undefined";
}
}
}
enum Type {
SCIENCE,
BELLETRISTIC,
PHANTASY,
SCIENCE_FICTION
}
No exemplo, o enum
Type contém quatro gêneros de livros.
A classe Book
possui um campo bookType
do tipo Type
.
O método getType()
usa switch
para retornar a descrição correspondente.
Métodos de enum
Todo enum
herda automaticamente métodos da classe java.lang.Enum
.
Os mais usados são:
values()
→ retorna um array com todas as constantes.ordinal()
→ retorna a posição da constante na lista (índice inicia em 0).
public class Program {
public static void main(String[] args) {
// Listar todas as constantes
for (Type t : Type.values()) {
System.out.println(t);
}
// Posição da constante
System.out.println(Type.BELLETRISTIC.ordinal()); // 1
}
}
Construtores, Campos e Métodos
Um enum
pode ter construtores, campos e métodos, assim como uma classe.
O construtor de um enum
é sempre privado (implícito ou explícito).
public class Program {
public static void main(String[] args) {
System.out.println(Color.RED.getCode()); // #FF0000
System.out.println(Color.GREEN.getCode()); // #00FF00
}
}
enum Color {
RED("#FF0000"), BLUE("#0000FF"), GREEN("#00FF00");
private String code;
Color(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
Métodos Específicos para Constantes
Cada constante de um enum
pode sobrescrever métodos individualmente.
public class Program {
public static void main(String[] args) {
Operation op = Operation.SUM;
System.out.println(op.action(10, 4)); // 14
op = Operation.MULTIPLY;
System.out.println(op.action(6, 4)); // 24
}
}
enum Operation {
SUM {
public int action(int x, int y) { return x + y; }
},
SUBTRACT {
public int action(int x, int y) { return x - y; }
},
MULTIPLY {
public int action(int x, int y) { return x * y; }
};
public abstract int action(int x, int y);
}
ℹ️ Dica: Essa técnica é útil quando cada constante precisa de um comportamento diferente para o mesmo método.