Qual é a melhor abordagem para a utilização de um Enum como um singleton em Java?
Pergunta
Com base no que foi escrito, na questão Melhor Singleton Implementação Em Java - saber sobre o uso de um enum para criar um singleton - quais são as diferenças/vantagens/desvantagens entre (construtor omitido)
public enum Elvis {
INSTANCE;
private int age;
public int getAge() {
return age;
}
}
e, em seguida, chamar Elvis.INSTANCE.getAge()
e
public enum Elvis {
INSTANCE;
private int age;
public static int getAge() {
return INSTANCE.age;
}
}
e, em seguida, chamar Elvis.getAge()
Solução
Suponha que você seja vinculativo a algo que usará as propriedades de qualquer objeto que ele tenha - você pode passar por Elvis.Instance com muita facilidade, mas não pode passar por Elvis.class e esperar que ela encontre a propriedade (a menos que seja deliberadamente codificada para encontrar propriedades estáticas das classes).
Basicamente, você só usa o padrão de singleton quando você querer uma instância. Se os métodos estáticos funcionarem bem para você, basta usá -los e não se preocupe com a enumeração.
Outras dicas
Uma grande vantagem é quando o seu singleton deve implementar uma interface. Seguindo o seu exemplo:
public enum Elvis implements HasAge {
INSTANCE;
private int age;
@Override
public int getAge() {
return age;
}
}
Com:
public interface HasAge {
public int getAge();
}
Não pode ser feito com estática ...
(Stateful) Singletons são geralmente usados para fingir não estar utilizando variáveis estáticas.Se você não usar o publicamente estática variável, em seguida, você vai enganar as pessoas menos.
Eu escolheria a opção que é a mais simples e clara. Isso é um pouco subjetivo, mas se você não souber o que é mais claro, basta optar pela opção mais curta.