| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/06/2007 22:32:07
|
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2007 00:39:02
|
RaulCarlin
JavaEvangelist
![[Avatar]](/images/avatar/0b94ce08688c6389ce7b68c52ce3f8c7.png)
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...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2007 00:54:57
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2007 00:58:37
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2007 15:54:46
|
RafaelVS
JavaEvangelist
![[Avatar]](/images/avatar/50454f95bbf5e6478cc0a55d08338731.jpg)
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%) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2007 16:30:37
|
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 :(
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2007 17:10:23
|
RafaelVS
JavaEvangelist
![[Avatar]](/images/avatar/50454f95bbf5e6478cc0a55d08338731.jpg)
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%) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2007 17:26:23
|
RafaelVS
JavaEvangelist
![[Avatar]](/images/avatar/50454f95bbf5e6478cc0a55d08338731.jpg)
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%) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2007 21:57:26
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/06/2007 08:32:16
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2007 19:12:32
|
xandinhocavalcante
Thread.start()
![[Avatar]](/images/avatar/7690dd4db7a92524c684e3191919eb6b.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2007 19:49:03
|
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/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2007 21:39:30
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/12/2007 00:16:54
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/12/2007 00:20:00
|
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 |
|
|
 |
|
|