Duvida muito simples sobre Enum consegui fazer mais nao consegui entender como funciona

2 respostas
M
package revista.util;

public enum EnumDiretorioOutput {
	
	IMAGEM("c:/windows/temp/revista/imagem"),
	HTML("c:/windows/temp/revista/html");
	
	private String value;
	
	private EnumDiretorioOutput(String value) {
		this.value = value;
	}
	
	public String getValue() {
		return value;
	}
}

quando de uma classe main eu chamo exemplo

System.out.println(EnumDiretorioOutput.HTML.getValue());
funciona, mais nao entendo porquef funciona. é como se eu tive chamando o construtor direto ou passando parametro para o construtor quando eu faço?
EnumDiretorioOutput.HTML

2 Respostas

ViniGodoy
Isso é mais ou menos equivalente a isso aqui:
package revista.util;

public class EnumDiretorioOutput {
	
	public static final EnumDiretorioOuput IMAGEM = new EnumDiretorioOuput("c:/windows/temp/revista/imagem"),
	public static final EnumDiretorioOuput HTML = new EnumDiretorioOuput("c:/windows/temp/revista/html");
	
	private String value;
	
	private EnumDiretorioOutput(String value) {
		this.value = value;
	}
	
	public String getValue() {
		return value;
	}
}
renanreismartins

olá, é importante entender primeiro pq usar enum.

Vamos supor que meu sistema pode se conectar a três bancos de dados, posso informar um número para dizer qual banco eu quero:

1 - mysql
2 - oracle
3 - sql server

então imagine que tenho um método que retorna a conexão de acordo com o banco:

public class GeraConexao {
   public Connection pegaConexaoDeAcordoComBanco(int numero)   {
      if(numero == 1) // retorna banco mysql
      if(numero == 2) // retorna banco oracle
      if(numero == 3) // retorna banco sql server
   }
}

então posso usar essa classe assim:

Connection c = new GeraConexao().pegaConexaoDeAcordoComBanco(2);

Note, que sem abrir a classe GeraConexao, vc jamais saberia o que significa o numero 2 passado como parametro. É como se fosse um numero magico.

Ai o pessoal resolveu esse problema de uma forma mais elegante, criando estáticas constantes dentro das classes.

Logo seu código ficaria assim:

public class GeraConexao {

   public static final int MYSQL = 1;
   public static final int ORACLE = 2;
   public static final int SQL_SERVER = 3;


   public Connection pegaConexaoDeAcordoComBanco(int numero)   {
      if(numero == 1) // retorna banco mysql
      if(numero == 2) // retorna banco oracle
      if(numero == 3) // retorna banco sql server
   }
}

e então vc poderia usar fazendo:

Connection c = new GeraConexao().pegaConexaoDeAcordoComBanco(GeraConexao.MYSQL);

veja que agora ficou um pouco mais legível, vc sabe que está passando um parametro que informa qual banco vc quer usar.

Porém existe um detalhe importante que talves vc ainda não tenha pego, seu parametro do metódo pegaConexaoDeAcordoComBanco, não deixou de ser um int, logo ninguém impede vc passar um parametro
não esperado como o valor 5 por exemplo.

Connection c = new GeraConexao().pegaConexaoDeAcordoComBanco(5);

Seu código ainda não está seguro o suficiente. Vc não tem como impedir a passagem de um valor que não existe, foi dai a necessidade de usar enums.

Então vamos converter isso para utilizar enum, primeiro sua enum:

public enum Bancos {
	MYSQL("192.168.1.1"), ORACLE("192.168.1.2"), SQL_SERVER("192.168.1.3")

	 private String ip;  
	      
	    private Bancos(String ip) {  
		this.ip = ip;  
	    }  
	      
	    public String getIp() {  
		return ip;  
	    }
}

agora a classe:

public class GeraConexao {

  public Connection pegaConexaoDeAcordoComBanco(Bancos banco)   {
      if(banco == Bancos.MYSQL) // retorna banco mysql
      if(banco == Bancos.ORACLE) // retorna banco oracle
      if(banco == Bancos.SQL_SERVER) // retorna banco sql server

	// pego o ip do banco banco.getIp();
   }
}

RESPOSTA DA PERGUNTA:
Veja que no momento que declaramos nossa enum, já passamos para ela os valores para o CONSTRUTOR. Ou seja, quando você chama Bancos.MYSQL.getIp() o valor do ip já havia sido definido no construtor. Por isso você já tem o valor.

Enum deve ser usado quando você tem opções limitadas, vc pode colocar os valores que espera em seus atributos enquanto desenvolve, elas podem ter o comportamento semelhante a de uma classe, contendo metodos, atributos e etc.

para finalizar, quando chamar meu método pegaConexaoDeAcordoComBanco, posso fazer:

Connection c = new GeraConexao().pegaConexaoDeAcordoComBanco(Bancos.MYSQL);

entendido?

UPDATE: demorei a escrever a resposta nao tinha visto o q o vinny escreveu. Mas fica ai uma explicação sobre o conceito.

abrassss

Criado 19 de janeiro de 2013
Ultima resposta 19 de jan. de 2013
Respostas 2
Participantes 3