Quando rodei o programa acima com a opção -verbose, vi o seguinte:
[Loaded Teste from file:/C:/temp2/java/]
[Loaded java.lang.Enum from shared objects file]
[Loaded EnumTeste from file:/C:/temp2/java/]
Construtor
static
teste
...
Ou seja, ele carregou a classe Teste (para poder executar a função “teste”), a seguir a classe java.lang.Enum (que é a superclasse de EnumTeste e de todas as outras Enums) e então executou o teste.
Dá a nítida impressão que ele faz o seguinte:
As constantes enums são definidas (é como se fosse executado algo como “public static enum EnumTeste Teste = new Teste (1)” na definição da enum)
A seguir, os blocos static são executados.
É um pouco inesperado, já que você pensaria o contrário (primeiro o static e depois os enums), mas faz algum sentido se o bloco static depender de algum enum já estar inicializado.
Eu costumo fazer isso com algumas enums por aqui e funciona muito bem
public enum TipoSanguineo {
A,
B,
AB,
O;
private static Map<String, TipoSanguineo> relations;
public static TipoSanguineo byValue(String abo){
return relations.get(abo);
}
static {
relations = new HashMap<String, TipoSanguineo>();
relations.put("A", A);
relations.put("B", B);
relations.put("AB", AB);
relations.put("O", O);
}
}
Faço isso quando tenho as constantes como constraints no banco de dados, por exemplo, e preciso converter para enums dentro dos objetos persistidos (usando JDBC).