Tenho alguns enums em um projeto (java 6), algo como:
enum Regiao {
RCN, RCS, SUD, SUL;
}
FazendoEnum.valueOf(Regiao.class, "RCS");
, recupero a constante sem problemas.
Entretanto, estou tentando criar um método dinâmico onde passo o nome, ou mesmo a classe do Enum em tempo de execução. Fiz: Enum.valueOf(Class.forName("domain.Regiao"), "RCS");
// ou mesmo
Enum.valueOf(Class c, String valor);
e nem mesmo compila. Parece que falta algum cast, o Eclipse informa[quote]Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not
applicable for the arguments (Class<capture#6-of ?>, String). The inferred type capture#6-of ? is
not a valid substitute for the bounded parameter <T extends Enum><T>>[/quote]
Alguém já implementou algo do tipo?
Faz assim:
[code] Class enumClass = Class.forName("domain.Regiao");
Enum enumTest = Enum.valueOf(enumClass, "RCS");[/code]
–
Alysson Bandeira
enum Alunos {
JOAO, PEDRO, LUCAS
}
enum Alunas {
MARCIA, REGINA, LUISA
}
class TesteEnum3 {
public static void main(String[] args) throws ClassNotFoundException {
// Isto funciona OK...
Enum en1 = Enum.valueOf (Alunos.class, "JOAO");
System.out.println (en1); // imprime JOAO
// e isto também funciona OK (provavelmente é o que você vai ter de usar), embora
// tenha um "SuppressWarnings" meio chato:
Class klass2 = Class.forName ("Alunos");
@SuppressWarnings ("unchecked") Enum en2 = Enum.valueOf (klass2, "PEDRO");
System.out.println (en2); // imprime PEDRO
// O que vem a seguir requer, de qualquer maneira, a importação
// da classe Alunos, portanto não é bem o que você quer:
Class<Alunas> klass3 = Alunas.class; // veja a declaração
Alunas al3 = Enum.valueOf (klass3, "MARCIA");
System.out.println (al3); // imprime MARCIA
// Se em vez de Alunas.class tivéssemos Class.forName ("Alunas")
// o caso é um pouco pior, já que temos de
@SuppressWarnings ("unchecked") Class<Alunas> klass4 =
(Class<Alunas>) Class.forName ("Alunas");
Alunas al4 = Enum.valueOf (klass4, "REGINA");
System.out.println (al4); // imprime REGINA
// Note que o "SuppressWarnings" deve ser usado apenas quando se sabe
// o que está fazendo. Vamos fazer um cast errado de propósito:
@SuppressWarnings ("unchecked") Class<Alunas> klass5 =
(Class<Alunas>) Class.forName ("Alunos"); // O compilador deixa passar...
// A linha a seguir provoca, em tempo de execução, um
// IllegalArgumentException ("No enum const class Alunos.LUISA")
Alunas al5 = Enum.valueOf (klass5, "LUISA");
System.out.println (al5);
}
}
Alguem utiliza enums como se fossem (arg!) Singletons?