Na resposta superior, há uma definição de enumeração. Gostaria de um exemplo de como essa enumeração definida seria usada no código. Por exemplo, como o ctor definido seria usado para criar uma instância de enum com um valor inteiro específico.
ScottF
@ ScottF se eu fosse você, em vez de definir uma recompensa neste post, prefiro postar uma pergunta completamente nova ..... ou ler a documentação sobre enumerações. Parece que você precisa entender alguns conhecimentos básicos sobre o assunto;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
Oscar Oscar
Respostas:
307
As enumerações Java não são como as enumerações C ou C ++, que são apenas rótulos para números inteiros.
As enums de Java são implementadas mais como classes - e podem até ter vários atributos.
A grande diferença é que eles são seguros para o tipo, o que significa que você não precisa se preocupar em atribuir uma enumeração COLOR a uma variável SIZE.
Com base na sua declaração, a melhor prática usando java para criar uma enumeração de números inteiros seqüenciais (semelhante a uma enumeração C ++), para um índice em uma matriz ou algo assim, seria escrever: enum Ids {NAME (0), AGE (1 ), ALTURA (2), PESO (3); } Obrigado, -bn
bn.
Possivelmente, e especialmente se você serializar os valores integrais em algum lugar.
lavinio 24/07/11
1
você pode dizer como usar essa enumeração em uma função?
Bugs Hap
2
É preguiçoso dos padrões Java não permitir que um valor seja definido para uma enumeração. Pelo menos o c # permite que este AND seja do tipo seguro.
csmith
2
FWIW, C ++ 11 agora tem um tipo seguro enum class.
Phoenix
92
Sim. Você pode passar os valores numéricos para o construtor da enumeração, da seguinte maneira:
Legal. É possível misturar? Ou seja, atribua apenas números aos valores Enum escolhidos.
Frederick Nord
modificador privado é redundante para construtores de enumeração
Nino van Hooff
@FrederickNord - Claro. Basta adicionar um segundo construtor privado sem argumentos que inicialize valueem um (digamos) zero. Em seguida, inclua (digamos) DANCEna lista de valores.
Por que é getColorValue()sincronizado no segundo exemplo?
josaphatv
@josaphatv Toda a funcionalidade do segundo exemplo é estática, nunca muda. Você pode querer HL_COLORS.getColorValue(HL_COLORS.YELLOW);sem inicializar a enumeração.
mazunki 9/03
11
Se você usar tipos de enumeração muito grandes, poderá ser útil seguir;
A função ordinal () retorna a posição relativa do identificador na enumeração. Você pode usar isso para obter a indexação automática com um deslocamento, como em uma enumeração no estilo C.
Edit: acabei de perceber que isso é muito semelhante à resposta de ggrandes , mas vou deixar aqui porque é muito limpo e o mais próximo possível de uma enumeração de estilo C.
No exemplo, você pega um enum e obtém um int. Você pode mostrar o inverso, pegar um int e terminar com um enum (sem uma caixa de opção explícita para cada valor?)
ScottF
De acordo com a pergunta, acredito que esta é a resposta mais adequada. Aqui, alteramos o índice padrão de enum para começar de 100 sem definir nova variável e atribuí-las via construtor.
Rahul Jain
@RahulJain Prefiro usar a resposta aceita. Parece mais limpo para mim.
lealceldeiro
1
@scottf
Um enum é como um Singleton. A JVM cria a instância.
Se você o criar sozinho com classes, pode ser assim
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
E poderia ser usado assim:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid main(String[]args){System.out.println(MyEnum.ONE);System.out.println(MyEnum.TWO);System.out.println(MyEnum.ONE ==MyEnum.ONE);System.out.println("Hello World");}}
@ scottf, você provavelmente confundiu por causa do construtor definido no ENUM.
Deixe-me explicar isso.
Quando class loadercarrega a enumclasse, o enumconstrutor também é chamado. Em que!! Sim, é chamado OPENe close. Com que valores 100para OPENe 200paraclose
Mas, é uma prática ruim. enumé usado para representar constantsiguais days of week, colors in rainbowou seja, um pequeno grupo de constantes predefinidas.
enum ids {OPEN = 100, CLOSE};
?Respostas:
As enumerações Java não são como as enumerações C ou C ++, que são apenas rótulos para números inteiros.
As enums de Java são implementadas mais como classes - e podem até ter vários atributos.
A grande diferença é que eles são seguros para o tipo, o que significa que você não precisa se preocupar em atribuir uma enumeração COLOR a uma variável SIZE.
Veja http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html para obter mais informações.
fonte
enum class
.Sim. Você pode passar os valores numéricos para o construtor da enumeração, da seguinte maneira:
Consulte o Sun Java Language Guide para obter mais informações.
fonte
value
em um (digamos) zero. Em seguida, inclua (digamos)DANCE
na lista de valores.que tal usar desta maneira:
existe apenas um método ..
você pode usar o método estático e passar o Enum como parâmetro como:
Observe que essas duas maneiras usam menos memória e mais unidades de processo. Não digo que essa seja a melhor maneira, mas é apenas outra abordagem.
fonte
getColorValue()
sincronizado no segundo exemplo?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
sem inicializar a enumeração.Se você usar tipos de enumeração muito grandes, poderá ser útil seguir;
fonte
Se você deseja emular a enumeração de C / C ++ (número base e nexos incrementais):
fonte
A função ordinal () retorna a posição relativa do identificador na enumeração. Você pode usar isso para obter a indexação automática com um deslocamento, como em uma enumeração no estilo C.
Exemplo:
Dá a saída:
Edit: acabei de perceber que isso é muito semelhante à resposta de ggrandes , mas vou deixar aqui porque é muito limpo e o mais próximo possível de uma enumeração de estilo C.
fonte
@scottf
Um enum é como um Singleton. A JVM cria a instância.
Se você o criar sozinho com classes, pode ser assim
E poderia ser usado assim:
fonte
@ scottf, você provavelmente confundiu por causa do construtor definido no ENUM.
Deixe-me explicar isso.
Quando
class loader
carrega aenum
classe, oenum
construtor também é chamado. Em que!! Sim, é chamadoOPEN
eclose
. Com que valores100
paraOPEN
e200
paraclose
Posso ter um valor diferente?
Sim,
Mas, é uma prática ruim.
enum
é usado para representarconstants
iguaisdays of week
,colors in rainbow
ou seja, um pequeno grupo de constantes predefinidas.fonte
Eu acho que você está confuso de olhar para enumeradores C ++. Os enumeradores Java são diferentes.
Esse seria o código se você estiver acostumado a enumerações C / C ++:
fonte