Por que o construtor de enum não pode acessar campos e métodos estáticos? Isso é perfeitamente válido com uma classe, mas não é permitido com um enum.
O que estou tentando fazer é armazenar minhas instâncias de enum em um mapa estático. Considere este código de exemplo que permite a pesquisa por abbreivação:
public enum Day {
Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
private Day(String abbreviation) {
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
Isso não funcionará, pois enum não permite referências estáticas em seu construtor. No entanto, funciona apenas para descobrir se implementado como uma classe:
public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
this.name = name;
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Valid
}
final
). Acho que vai ser difícil de pegar!EnumSet.allOf
vez deEnum.values()
? Eu pergunto porquevalues
é uma espécie de método fantasma (não consigo ver a fonteEnum.class
) e não sei quando foi criadoEnum.values()
é mais rápido se você planeja iterar sobre eles com um loop for aprimorado (uma vez que retorna um array), mas principalmente se trata de estilo e caso de uso. Provavelmente é melhor usarEnumSet.allOf()
se você deseja escrever código que existe na documentação do Java em vez de apenas nas especificações, mas muitas pessoas parecem estar familiarizadas deEnum.values()
qualquer maneira.Citação de JLS, seção "Declarações de corpo de enum" :
fonte
talvez seja isso que você quer
fonte
Collections.unmodifiableMap()
é uma prática muito boa aqui. +1O problema foi resolvido por meio de uma classe aninhada. Prós: é mais curto e também melhor pelo consumo de CPU. Contras: mais uma classe de memória JVM.
fonte
Quando uma classe é carregada na JVM, os campos estáticos são inicializados na ordem em que aparecem no código. Por exemplo
A saída será 0. Observe que a inicialização de test4 ocorre no processo de inicialização estática e, durante esse tempo, j ainda não foi inicializado como aparecerá mais tarde. Agora, se mudarmos a ordem dos inicializadores estáticos de forma que j venha antes de test4. A saída será 6. Mas no caso de Enums, não podemos alterar a ordem dos campos estáticos. A primeira coisa em enum devem ser as constantes, que são, na verdade, instâncias finais estáticas do tipo enum. Assim, para enums, é sempre garantido que os campos estáticos não sejam inicializados antes das constantes de enum. Visto que não podemos fornecer nenhum valor sensível a campos estáticos para uso no construtor de enum , não faria sentido acessá-los no construtor enum.
fonte