Enums  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
#@®®¡$
Moderador
[Avatar]

Membro desde: 13/02/2004 09:42:28
Mensagens: 807
Localização: São Paulo
Offline

Baseado em um probleminha que tivemos aqui no trabalho e só depois de um tempinho fomos entender.

O que será impresso primeiro, "Construtor" ou "static"? E porquê?


Wilerson "#@®®¡$" de Oliveira
http://mundoestranho.net/blog/
Douglas Adams wrote:I love deadlines. I like the whooshing sound they make as they fly by.
[WWW] [ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Quando rodei o programa acima com a opção -verbose, vi o seguinte:

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.

[WWW]
sech777
JavaBaby
[Avatar]

Membro desde: 14/05/2007 22:52:47
Mensagens: 92
Localização: São Paulo, SP
Offline

Muito Interessante!

SCJP 6.0
"As veredas dos justos são como a luz da aurora, que vai brilhando mais e mais até ser dia perfeito" - Pv. 4:18
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

thingol wrote:
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.


Mais explicitamente, citando a Java Language Specification:
JLS wrote:
Any constructor or member declarations within an enum declaration apply to the enum type exactly as if they had been present in the class body of a normal class declaration unless explicitly stated otherwise.

The direct superclass of an enum type named E is Enum<E>. In addition to the members it inherits from Enum<E>, for each declared enum constant with the name n the enum type has an implicitly declared public static final field named n of type E. These fields are considered to be declared in the same order as the corresponding enum constants, before any static fields explicitly declared in the enum type. Each such field is initialized to the enum constant that corresponds to it. Each such field is also considered to be annotated by the same annotations as the corresponding enum constant. The enum constant is said to be created when the corresponding field is initialized.


Ou seja, ele inicializa as constantes (chamando os construtores se necessário), e então executa o bloco static.

[WWW]
Tecnoage
GUJ Master

Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline

ue???

Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br
[Email] [WWW] [MSN]
Alexandre Ferreira
Virtual Machine Man
[Avatar]

Membro desde: 20/09/2006 20:07:03
Mensagens: 520
Localização: Rio de Janeiro
Offline

Tecnoage wrote:ue???

Nas classes sao diferentes...

Alexandre Ferreira
Blog: http://alexandreferreira.com.br
[WWW] [MSN]
cassio
GUJ Master
[Avatar]

Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline

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).

Cássio Marques

Blog
agodinhost
Virtual Machine Man
[Avatar]

Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline

cassio wrote:

Muito bom, gostei. Só o nome do método que poderia ser diferente né? getByName, getByString - acho byValue meio confuso.

"The difference between theory and practice is that, in theory, there is no difference between theory and practice".
[WWW] [MSN]
cassio
GUJ Master
[Avatar]

Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline

agodinhost wrote:
cassio wrote:

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().

Cássio Marques

Blog
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

blocos static sao carregados junto com a class, entao ele é executado antes de qualquer coisa.. por isso...
experimente aqui


flw!

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team