Dúvida em enum  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
bcartaxo
JavaTeenager

Membro desde: 06/11/2006 00:35:48
Mensagens: 193
Localização: Recife - PE
Offline

Estou estudando pelo livro de Kathy para tirar a SCJP.

Vendo esse cídogo fiquei meio atrapalhado.



Ele dá como saída: Woof Burble

A minha dúvida é a seguinte:

A varíavel de classe a do tipo Animals não deveria ter sido inicializada??
E mais, ele não deveria conter somente uma constante do enum, pelo que vi ela tem todo o enum, por ela eu obtenho todas as constantes do enum.

Normalmente quando uso um enum faço mais ou menos assim:



Ele imprime justamente TESTE1, porque ao escrever o seguinte código, eu consigo acessar as demais constantes do enum??? A variável enumTest não deveria ser somente uma EnumTeste.TESTE1 n???



Não esperava que o código acima compilasse. Alguem sabe me explicar o porquê de tudo isso? =P
[MSN]
RaulCarlin
JavaEvangelist
[Avatar]

Membro desde: 20/05/2005 12:58:30
Mensagens: 389
Localização: São Paulo
Offline

A variavel está com o modificador de acesso default(sem nenhum). Coloca como private...
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

acolon wrote:

A minha dúvida é a seguinte:

A varíavel de classe a do tipo Animals não deveria ter sido inicializada??



A variável foi inicializada.
Esta questão é recorrente e na realidade testa se vc entende o conceito de static e não o de enum.

Sendo que todas as instancias do enum são constantes estáticas da classe do enum então eu posso aceder a uma instancia do enum pelo nome da classe como em Animals.DOG ou por uma instancia dessa classe , no caso a.
Eu poderia fazer Animals.DOG.FISH.sound e obteria o som de peixe.



Normalmente quando uso um enum faço mais ou menos assim:





Vc deveria fazer :



Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
bcartaxo
JavaTeenager

Membro desde: 06/11/2006 00:35:48
Mensagens: 193
Localização: Recife - PE
Offline

Hum... então acho q entendi, todas as contantes do enum são static.
Vlw kra.
[MSN]
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

Eu ia criar um tópico para postar uma dúvida sobre enum, mas vou aproveitar esse aqui.

Não estou conseguindo usar enum em switch... até mesmo esse exemplo que sergiotaborda colocou... tá dando o seguinte erro:

The enum constant Teste.EnumTeste.TESTE1 reference cannot be qualified in a case label

(na verdade, o erro está em todas as 3 constantes, não é apenas em TESTE1 não.)

Alguém sabe pq tá dando esse erro?

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
thingol
Moderador

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


The enum constant Teste.EnumTeste.TESTE1 reference cannot be qualified in a case label


Experimente tirar a qualificação (usar TESTE1 em vez de Teste.EnumTeste.TESTE1).

Isso quer dizer também o seguinte: se a constante enum tiver sido criada em um outro arquivo .java (não no mesmo), não se pode usar a constante em um "switch". Que sinistro :(
[WWW]
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

entendi... agora quando fui testar vi outra coisa que nao entendi...

coloquei o codigo dessa forma:



TESTE1 e TESTE2 compilam... mas dá erro em enumTeste1... diz o seguinte:



o que eu consegui entender foi o seguinte: quando a expressão a ser avaliada no switch é um enum, vc não precisa colocar a constante qualificada, pois o compilador já vai saber o tipo do enum e só vai permitir vc colocar no case algum valor que tenha sido definido na declaração do enum. Assim, mesmo enumTeste1 sendo uma variável do tipo do enum e estando com um valor que é uma constante válida, como não existe a constante enumTeste1, dá erro de compilação... é isso mesmo?

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

fazendo os testes aqui, também verifiquei que se vc declarar o enum fora de uma classe (no seu própprio .java ou dentro de um outro .java - lembrando que o enum não poderá ser public se a classe for public), você pode usar suas constantes no case... e não precisa ser qualificado justamente porque deve funcionar como eu citei acima... o compilador já sabe em qual enum procurar por causa do tipo da variável que tá na expressão do switch.. então não precisamos colocar o nome qualificado por causa disso... deve ser isso mesmo correto?

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

RafaelVS wrote:. então não precisamos colocar o nome qualificado por causa disso... deve ser isso mesmo correto?


É isso mesmo. Na pressa deixei o nome qualificado, mas é sem qualificação.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Para entender 100% o enum, o ideal é entender de onde partiu a idéia de se fazer um enum tão exótico assim.

Na verdade, partiu do conceito de typesafe enum pattern, explicado por Joshua Bloch, no Livro Effective Java, no item 21.

http://java.sun.com/developer/Books/effectivejava/Chapter5.pdf

O enum do Java 5, só apresenta uma sintaxe simplificada e algumas facilidades para a implementação de um enum desse tipo. Eu recomendo fortemente a leitura desse item 21.
[WWW]
xandinhocavalcante
Thread.start()
[Avatar]

Membro desde: 11/04/2006 13:12:46
Mensagens: 40
Localização: Rio de Janeiro
Offline

Tópico que salvou da dúvida cruel quase 6 meses depois...... Obrigado a força amigos!

Xande Cavalcante photo ->Chico The Cat
LPJava
GUJ Hacker

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

RafaelVS wrote:fazendo os testes aqui, também verifiquei que se vc declarar o enum fora de uma classe (no seu própprio .java ou dentro de um outro .java - lembrando que o enum não poderá ser public se a classe for public), você pode usar suas constantes no case... e não precisa ser qualificado justamente porque deve funcionar como eu citei acima... o compilador já sabe em qual enum procurar por causa do tipo da variável que tá na expressão do switch.. então não precisamos colocar o nome qualificado por causa disso... deve ser isso mesmo correto?


sim enum fora da classe pode ser public ou default pq enum é um tipo especial de classe... e no switch nao pode ser isto:


isso acima é invaliado...


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]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Olá pegando carona no tópico,
porque o Enum só aceita construtores default e private??

E se eu estiver em outro pacote, então nao vou poder criar o enum???



Att

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
gk-bgh
JavaGuru

Membro desde: 27/04/2007 22:42:28
Mensagens: 200
Offline

danielbussade wrote:Olá pegando carona no tópico,
porque o Enum só aceita construtores default e private??

E se eu estiver em outro pacote, então nao vou poder criar o enum???



Att


Não entendi. Você testou isso que você falou? Porque pela lógica tanto faz o acesso do construtor do enum já que ele não pode ser acessado diretamente. Ou seja, você não pode dar
new nome_enum();
(mesmo o construtor do enum possuindo acesso default)
Então, seguindo essa lógica o construtor do enum pode ter qualquer modificador. (assim como qualquer construtor)


[]s
Gunnar

Bacharel em Ciência da Computação PUC Minas.
Cursando Pós-Graduação em Administração de Empresas na Fundação Getúlio Vargas
Sun Certified Associate for Java Platform
Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
gk-bgh
JavaGuru

Membro desde: 27/04/2007 22:42:28
Mensagens: 200
Offline

RafaelVS wrote:fazendo os testes aqui, também verifiquei que se vc declarar o enum fora de uma classe (no seu própprio .java ou dentro de um outro .java - lembrando que o enum não poderá ser public se a classe for public), você pode usar suas constantes no case... e não precisa ser qualificado justamente porque deve funcionar como eu citei acima... o compilador já sabe em qual enum procurar por causa do tipo da variável que tá na expressão do switch.. então não precisamos colocar o nome qualificado por causa disso... deve ser isso mesmo correto?


O case do switch não pode ser usado usando as variáveis qualificadas do enum, independente de onde o enum seja declarado.
A expressão1 do switch deve avaliar para um enum , ou para int. Quando avalia para enum só faz sentido os cases possuirem valores declarados no enum (que por sua vez também são instâncias do enum).

[]s
Gunnar

Bacharel em Ciência da Computação PUC Minas.
Cursando Pós-Graduação em Administração de Empresas na Fundação Getúlio Vargas
Sun Certified Associate for Java Platform
Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team