ti-enxame.com

Elementos enum de Java com espaços?

Estou trabalhando em Java, eu criei um enum da seguinte forma:

public enum myEnum
{
    india,
    russian,
    england,
    north America
}

O exemplo acima dá erros ao usar o espaço no nome do elemento (ou seja, na América do Norte). Alguma sugestão como resolver o problema acima?

24
BSalunke

Você não pode colocar um espaço no meio de um identificador. 

Fazer isso termina esse identificador e o analisador assume que o que vem a seguir é um token válido no contexto dessa instrução. Há poucos (se houver) lugares que seriam legais.

Nomes de valores convencionais de Java seriam:

INDIA,         // Or  India,
RUSSIA,        //     Russia,
NORTH_AMERICA; //     NorthAmerica;

Um enum pode ter propriedades associadas, como nomes legíveis por humanos, por exemplo,

public enum CountryAndOneContinent {

    INDIA("India"),
    RUSSIA("Russia"),
    NORTH_AMERICA("North America");

    private String displayName;

    CountryAndOneContinent(String displayName) {
        this.displayName = displayName;
    }

    public String displayName() { return displayName; }

    // Optionally and/or additionally, toString.
    @Override public String toString() { return displayName; }
}

Eu sou ambivalente sobre o uso de toString para fornecer representações de camada de apresentação.

Eu prefiro que os métodos comuniquem sua finalidade explicitamente - é mais expressivo e óbvio.

toString é bastante genérico e permite apenas uma única representação. Vários formatos de saída podem ser necessários dependendo do contexto, parâmetros, etc., que toString não permite.

As vantagens de toString incluem o uso de operações de string padrão no objeto e, nesse caso, o uso de valueOf para converter diretamente da versão legível para o valor enum.

64
Dave Newton

Eu vou continuar e adivinhar porque você quer um espaço no nome; porque você quer referenciá-lo como uma string.

Então faça isso:

public enum MyEnum {
    INDIA("India"),
    RUSSIAN("Russian"),
    ENGLAND("England"),
    NORTH_AMERICA("North America");    

    private String name;

    MyEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }    
}

Você pode considerar a substituição de string.

public toString() {
    return name;
}

Uma vantagem de substituir toString () é que essa string também pode ser usada em MyEnum .valueOf (myString). Portanto, substituir toString basicamente cria um HashMap dos valores enum.

15
Joe

O problema não tem nada (especificamente) a ver com enums: em Java, os nomes não podem ter espaços. Tente eliminar o espaço (usando letras maiúsculas para separar os bits) ou use sublinhados.

5
Scott Hunter

Escreva-os juntos como northAmerica ou use um sublinhado north_America.

3
Tudor

A regra de nomenclatura Java não permite espaços em branco como possíveis caracteres em um nome de variáveis, classes, enums e membros enum (e todos os outros identificadores). Portanto, esse "problema" não pode ser resolvido. Use apenas north_america como nome de membro!

Um identificador é uma sequência de comprimento ilimitado de letras Java e dígitos Java , O primeiro dos quais deve ser uma letra Java.

As letras Java incluem maiúsculas e minúsculas ASCII letras latinas AZ (\ u0041-\u005a) e az (\ u0061-\u007a) e, por motivos históricos , o ASCII sublinhado (_ ou\u005f) e cifrão ($, ou \u0024). O caractere $ deve ser usado apenas em código-fonte gerado mecanicamente Ou, raramente, para acessar nomes preexistentes em sistemas legados.

Os "dígitos Java" incluem os dígitos ASCII 0-9 (\ u0030-\u0039).

2
Matten
public enum myEnum
{
    india,
    russian,
    england,
    north_america
}

Para acessar valores

myEnum.values()
1
Marc Nuri

apenas faça o seu próprio valor - como função na sua classe enum. Substitua espaços por sublinhados. nomeie suas constantes de enum como "north_america (" North America ")". Se o método não encontrar o seu enum, apenas retornará o parâmetro. 

public  static String valueOfOrDefault(String myValue) {
//replace space with underscore so it matches enum name
        String value=myValue.toUpperCase().replaceAll("\\s", "_");
        for(myEnum type : myEnum.class.getEnumConstants()) {
          if(type.name().equalsIgnoreCase(value)) {
            return type.toString();
          }
        }
        return myValue;
      }
1
j2emanue

Eu também introduzi um método próprio valueOf. Mas volto com o tipo Enum e não preciso converter o "checkString"

checkString é "Petty Cash" por exemplo.

JournalType journalType = JournalType.valueOfOrDefault (checkString);

public enum JournalType {

MISC_BILLING("Misc Billing"),
MISC_BILLING_AUTONUM("Misc Billing AutoNum"),
PRETTY_CASH("Petty Cash"),
RECURRING_AP("Recurring AP"),
GL_JOURNAL("GL Journal"),
GDS_NDS("GDS/NDS");

private final String journalType;

JournalType(String journalType) {
    this.journalType = journalType;
}

@Override
public String toString() {
    return journalType;
}

public static JournalType valueOfOrDefault(String myValue) {
    for(JournalType type : JournalType.class.getEnumConstants()) {
        if(type.toString().equals(myValue)) {
            return type;
        }
    }
   throw new IllegalArgumentException("JournalType not found");
}

}
0
matzeihnsein