Enum?

14 respostas
Raff

Pessoal qual a deferença em declarar um enum dentro de uma classe e declarar um enum fora de um classe ?

ex:
public class TesteEnum{

public enum Naipe {ESPADA, PAUS, COPAS, OURO }

}
ex2
public enum Naipe {

	PAUS(20), COPAS(15), ESPADA(10), OURO(5);
	
	private int valor;
	
	private Naipe(int valor){
		this.valor = valor;
		
	}
	
	public int getValor(){
		
		return this.valor;
		
	}
	
}

Pessoal outro coisa que eu tenho duvida tbm é por que o construtor de enum so deve ser private ???
Pessoal não to entendendo muito bem Enum se alguem poder me dar um explicação como eles funcionam agradeço !!!!!!

14 Respostas

G

a diferenca é só na chamada…

um vc chama direto o enum e outro precisa usar a classe.

acho q é isso

thiago.correa

Enum dentro de uma classe funciona como uma innerclass, ou seja ela não é “visível” para as demais classe, so para a classe onde a mesma se encontra!

Java_Player

Veja esse exemplo de código que você vai entender:

enum Cores1 {VERMELHO, VERDE, AZUL}

public class TesteEnum {

	enum Cores2 {VERMELHO, VERDE, AZUL}
	
	void foo() {
		Cores1 cor1 = Cores1.VERMELHO;
		Cores2 cor2 = Cores2.VERMELHO;
	}
	
}

class TesteEnum2 {
	
	void foo() {
		Cores1 cor1 = Cores1.VERMELHO;
		TesteEnum.Cores2 cor2 = TesteEnum.Cores2.VERMELHO;
	}
	
}
Raff

Pessoal andei lendo e vi que não se poder instanciar um Enum, digo dar new em um enum será que é por isso que o construtor de um enum tem que ser private ??

R

O construtor do enum tem que ser private porque esse não pode ser chamado fora do enum, isto é, o construtor só existe porque quando vc declara uma constante de enum com argumentos, o seu construtor vai ser chamado internamente pela JVM para atribuir os argumentos às constantes. Nem mesmo você dentro do enum pode chamar o construtor do Enum. É impossível o programador chamar o construtor do enum.

ViniGodoy

Isso não é verdade. Qualquer Inner class estática e pública pode ser usada fora da classe onde foi declarada, como o caso do enum.

É útil pq muitos enums tem nomes similares como Tipo e seus valores estarão diretamente associados à uma classe específica. Então, é até melhor que eles estejam intrinsecamente ligados à classe a qual pertencem, como no exemplo aqui embaixo:

public class Carro { public enum Tipo {PASSEIO, UTILITARIO, EMPRESARIAL}; ///etc..etc...etc }

public class Apartamento { public enum Tipo {SIMPLES, DUPLEX, TRIPLEX}; ///etc..etc...etc }

ViniGodoy

É isso mesmo. Uma vez declarada, você não pode criar novos itens na enumeração. Até porque, isso iria ferir o conceito de enum.

R
Raff:
public enum Naipe {

	PAUS(20), COPAS(15), ESPADA(10), OURO(5);
	
	private int valor;
	
	private Naipe(int valor){
		this.valor = valor;
		
	}
	
	public int getValor(){
		
		return this.valor;
		
	}
	
}

Aproveitando o exemplo que o Raff deu sobre enum para explicar melhor:

Quando a JVM for carregar o enum Naipe ela vai rodar o construtor que recebe um int. Com isso, as constantes terão seus atributos inicializados com o valor passado como argumento.

Ou seja, você pode fazer:

Naipe.PAUS.getValor(); //Aqui você recebe 20
Naipe.COPAS.getValor(); //Aqui você recebe 15
Naipe.ESPADA.getValor(); //Aqui você recebe 10
Naipe.OURO.getValor(); //Aqui você recebe 5

A diferença de declarar dentro ou fora da classe é que se você estiver fora da classe onde o enum foi declarado você vai precisar informar o caminho da classe para acessar as constantes do enum (como um membro estático).

Java Player:
public class TesteEnum {
 
 	enum Cores2 {VERMELHO, VERDE, AZUL}
 	
 	void foo() {
 		Cores1 cor1 = Cores1.VERMELHO;
 		Cores2 cor2 = Cores2.VERMELHO;
 	}
 	
 }

Em uma outra classe você precisaria fazer:

TesteEnum.Cores2.VERMELHO;
thiago.correa:
Enum dentro de uma classe funciona como uma innerclass, ou seja ela não é "visível" para as demais classe, so para a classe onde a mesma se encontra!

Assim como inner classes, O enum é visível em outras classes de acordo com seu nível de acesso. Exemplo, Se uma inner class for public, ela é acessada de outras classes. O mesmo ocorre para o enum.

R

Outra coisa importante a ser vista sobre enums é que eles podem ser usados em switchs:

public class TesteEnum {
  
  	enum Cores2 {VERMELHO, VERDE, AZUL}
  	
        Cores2 minhaCor = Cores2.VERMELHO;

  	void foo() {
  		switch(minhaCor){
                       case VERMELHO: //faz qqr coisa.
                       case VERDE: //faz qqr coisa.
                       //case Cores2.AZUL: VC N PODE COLOCAR O NOME QUALIFICADO DO ENUM. Pelo tipo do argumento Cores2 o compilador  sabe quais as constantes do enum, portanto, vc ja pode colocar as constantes diretamente
                }
  	}
  	
  }
thiago.correa

Ok chupei bala sorry! :oops:

T

É isso mesmo. Uma vez declarada, você não pode criar novos itens na enumeração. Até porque, isso iria ferir o conceito de enum.

Um tipo ENUM define constantes que não podem ser modificadas, por isso eles são final implicitamente.

exato porque as enum são realmente tipos static, porem novemente isto fica implicito em TODOS os tipos enum.

ViniGodoy

Toni_Fatec:

É isso mesmo. Uma vez declarada, você não pode criar novos itens na enumeração. Até porque, isso iria ferir o conceito de enum.

E quando foi que eu disse o contrário?

Eu recomendo a todos a leitura do item 21 do livro effective java, que pode ser lido neste pdf. Ele explica como o typesafe enum pattern é implementado. O tipo enum do java é apenas um syntax suggar espertinho para esse pattern. Ele também dá considerações sobre o que pode ser feito com o enum e como.

A

Help me... Senão não vou dormir hoje hehehe...

não tou conseguindo comparar o valor do enum usando equals...

Veja meu código:
@SuppressWarnings("static-access")
	public static void main(String[] args) {
		String x="Sim";
		if ((MudaStatus.SIM).equals(x) ? true : false){
			System.out.println("Caralho funcionou!");
		} 
		else{
			System.out.println(MudaStatus.NAO);
		}
	}

e o enum:

package br.edu.andredecotia.scjp6.testes;

public enum MudaStatus{
	
	SIM("Sim"), NAO("Não"); 
	
	
	
	private MudaStatus(String teste){	
	}
}
ViniGodoy

Se vc já abriu seu tópico, para que ressuscitar esse? E como disse o bezier curve:
Um enum é sempre diferente de uma String, não?

O método equals sempre retorna false para tipos diferentes.

Criado 5 de julho de 2007
Ultima resposta 8 de set. de 2010
Respostas 14
Participantes 8