terça-feira, 4 de dezembro de 2012

Como converter Enum em String e vice versa

Se você é um programador Delphi, você vai adorar isto e detestar o Delphi. Em Java conseguimos fazer a conversão de String para Enum e de Enum para String.

Enum é um tipo cujos campos consistem em um conjunto fixo de constantes. Com são constantes, para seguirmos a padronização, os valores são escritos em maiúsculas. Um exemplo comum de um tipo enumerado são os pontos cardeais, cores, dias da semana.

Para definir um tipo enumerado, usamos a palavra chave enum, como no exemplo abaixo:

public enum DiasDaSemana {
     DOMINGO, SEGUNDA, TERÇA, QUARTA, QUINTA, SEXTA, SABADO
}

Por que nossos exemplos irão funcionar? Quando temos uma declaração enum como a acima, na verdade estamos extendendo a classe java.lang.Enum. A classe Enum pode incluir métodos e outros atributos. O compilador automaticamente adiciona alguns métodos quando cria um enum.

De String para Enum

As classes Enum possuem por default um método valueOf(String value) que pega o parâmetro e converte em um enum. Vamos testar uma enumeração normal:

public class EnumTest1 {
 
  private enum PTCARDEAL { NORTE, SUL, LESTE, OESTE }

  public static void main(String[] args) {
    //Mostra a conversão
    PTCARDEAL norte = PTCARDEAL.valueOf("NORTE");
    System.out.println(norte);
    PTCARDEAL sul = PTCARDEAL.valueOf("SUL");
    System.out.println(sul);
    PTCARDEAL leste = PTCARDEAL.valueOf("LESTE");
    System.out.println(leste);
  }
}

A saída para este programa já e muito mais bacana do que conseguiríamos no Delphi:

Podemos alterar os valores retornados como string sobrepondo as definições toString() para cada valor da enumeração. Vejamos o nosso exemplo original alterado:

public class EnumTest2 {
  private enum PTCARDEAL {

  /*
   * texto do poema "Sou quatro pontos cardeais"
   * http://poesiaoriginalissima.blogspot.com.br/2010/01/sou-quatro-pontos-cardeais.html
   */
  NORTE {
    @Override
    public String toString() {
      return "Norte é vida verde na terra…meu consciente";
    }
  },
  SUL {
    @Override
    public String toString() {
      return "Sul é água volta e revolta…num vario extenso";
    }
  },
  LESTE {
    @Override
    public String toString() {
      return "Este é cada aurora incluída neste dia\n"+
             "Acordo e penso: num sobressalto";
    }
  },
  OESTE {
    @Override
    public String toString() {
      return "Oeste…a certeza do presente";
    }
  }
}

public static void main(String[] args) {
    
  //Mostra a conversão
  PTCARDEAL norte = PTCARDEAL.valueOf("NORTE");
  System.out.println(norte);
  PTCARDEAL sul = PTCARDEAL.valueOf("SUL");
  System.out.println(sul);
  PTCARDEAL leste = PTCARDEAL.valueOf("LESTE");
  System.out.println(leste);
    
}
}

A saída deste programa é:

Vamos utilizar a mesma classe de EnumTest2 alterando
somente o método main().

Conseguimos com isto retornar os mesmos valores que em EnumTest1

public static void main(String[] args) {
    
        // Exemplo
        String norte = PTCARDEAL.NORTE.name();
        System.out.println(norte);
        String sul = PTCARDEAL.SUL.name();
        System.out.println(sul);
        String leste = PTCARDEAL.LESTE.name();
        System.out.println(leste);
}



Para o exemplo usamos Enum.name() que retorna o nome da constante enumerada exatamente como foi declarada.

Nenhum comentário:

Postar um comentário