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/]Construtorstaticteste...
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.
sech777
Muito Interessante!
T
thingol
Mais explicitamente, citando a Java Language Specification:
Ou seja, ele inicializa as constantes (chamando os construtores se necessário), e então executa o bloco static.
T
Tecnoage
ue???
A
Alexandre_Ferreira1
Nas classes sao diferentes…
cassio
Eu costumo fazer isso com algumas enums por aqui e funciona muito bem
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).
agodinho
Muito bom, gostei. Só o nome do método que poderia ser diferente né? getByName, getByString - acho byValue meio confuso.
cassio
Muito bom, gostei. Só o nome do método que poderia ser diferente né? getByName, getByString - acho byValue meio confuso.
Hum, pois é… seguindo sua idéia, talvez eu faça um refactoring para getByString().
LPJava
blocos static sao carregados junto com a class, entao ele é executado antes de qualquer coisa… por isso…
experimente aqui