Ajuda em ENUM

9 respostas
I

Boa Tarde, Pessoal!!

O enum abaixo esta funcionando corretamente. Porém preciso fazer uma pq alteração e não sei como.

Preciso trocar de :
MOBILE_BANKING_SERVER para MOBILE BANKING SERVER
WEB_BANKING_SERVER para WEB BANKING SERVER

Na realidade preciso da informação sem o underline.

Tentei colocar entre aspas duplas, mais sinaliza erro. Como faço???

[color=darkblue]public enum PointOfAccessType implements Serializable {

UNKNOW,
ATM,
MOBILE_BANKING_SERVER ,
WEB_BANKING_SERVER;

public String getLabel() {

this.name();

}

}[/color]

Agradeço desde já !!!

Izaura

9 Respostas

ViniGodoy

Você precisa criar uma propriedade no seu enum:

public enum PointOfAccessType implements Serializable {
   UNKNOW("Unknown"),
   ATM("ATM"),
   MOBILE_BANKING_SERVER("Mobile Banking Server"),
   WEB_BANKING_SERVER("Web Banking Server");
   private String label;

   private PointOfAccessType(String label) {
      this.label = label;
   }
   public String getLabel() {
      return label;
   }
}
E

Só uma coisinha - “desconhecido” em inglês é “unknown”, não “unknow”. Se você só precisa da representação string com espaços como retorno do método “getLabel”, então só precisa mudar esse método. É que identificadores em Java não podem ter espaços (a rigor, no Java 7 essa regra será relaxada, mas o uso será bem complexo, portanto não se recomenda usar identificadores com espaços mesmo no Java 7). No seu caso:

public enum PointOfAccessType implements Serializable {

UNKNOWN,
ATM,
MOBILE_BANKING_SERVER ,
WEB_BANKING_SERVER;

// retorna "WEB BANKING SERVER", não "WEB_BANKING_SERVER".
public String getLabel() {
    return this.toString().replace ("_", " ");
}

}
ViniGodoy

Engraçado, se já vem com uma recomendação dessas “de fábrica”, para que relaxar a regra, então?

I

Muito obrigada pela ajuda e explicação rapazes.

:smiley:

E

Engraçado, se já vem com uma recomendação dessas “de fábrica”, para que relaxar a regra, então?

É que identificadores com espaços, caracteres especiais e outras coisas esdrúxulas serão permitidos apenas para poder suportar outras linguagens na JVM.

http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001131.html

O exemplo da Izaura, compilado com a última versão disponível do JDK 7:

import java.io.Serializable;

// REQUER JAVA 7 - DISPONÍVEL EM: http://download.java.net/jdk7

public enum PointOfAccessType implements Serializable {
    UNKNOWN,  
    ATM,  
    #"MOBILE BANKING SERVER" ,  
    #"WEB BANKING SERVER";  
} 

class Teste {
    public static void main(String[] args) {
        for (PointOfAccessType e : PointOfAccessType.values()) {
            System.out.println ("[" + e + "]");
        }
    }
    // Saída esperada:
/*
[UNKNOWN]
[ATM]
[MOBILE BANKING SERVER]
[WEB BANKING SERVER]
 */
}
E

Mais um exemplo do abuso do #"" que pode haver no Java 7. O nome da classe tem um espaço, e algumas variáveis têm tabs ou espaços nos nomes. Entretanto, abusos têm limites. Um identificador com pontos é rejeitado porque se confunde com um identificador de pacote.

class #"Teste Absurdo" {
    // Note que você não pode usar os seguintes caracteres em identificadores: ".", "/", ";", "<", ">", "[", "]".
    public static void #"main"(String[] #"array de argumentos na linha de comando") {
        for (#"String" #"cada argumento" : #"array de argumentos na linha de comando") {
            String #"argumento-convertido{para\tminúsculas}" = #"cada argumento".#"toLowerCase"();
            System.#"out".println (#"argumento-convertido{para\tminúsculas}");
        }
    }
}
ViniGodoy

Suportar isso na VM eu até entendo, mas precisavam colocar isso na linguagem Java?

E

Isso foi posto (meio que “por debaixo dos panos”) porque a ideia básica é a seguinte: você quer compilar uma linguagem como Ruby ou Python para Java e usar identificadores esquisitos.

Você poderia gerar diretamente um .class (é o que o Jython ou o JRuby fazem) ou então passar pela etapa intermediária de ter um .java.

Para facilitar o mapeamento dos identificadores originais para os de um programa .java gerado (isso, como eu disse, não ajuda em linguagens já existentes, mas nas que você poderia criar com o suporte a “invokedynamic”, o John Rose “enfiou” esse tipo de identificadores no compilador.
(Ele, obviamente, passou por cima do JLS e outras coisas - já que ele tem acesso ao repositório Mercurial da Sun e acesso de commiter no JDK, ele simplesmente enfiou isso e comunicou o fato consumado ao Joe Darcy, que é o responsável pelo Project Coin.)

ViniGodoy

Se eu fosse gerente dele, mandaria ele tirar de lá. Passar por cima da comunidade é algo muito feio e, mesmo que fosse o goetz, eu daria uma xinxada.

Criado 4 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 9
Participantes 3