[quote=ViniGodoy][quote=sergiotaborda]não quero bater na tecla do singleton outra vez, mas qualque classe que tenha mais do que uma instancia não é singleton
Ou seja, variáveis de classes sigleton nunca são polimorficas. Enum criar variáveis polimorficas.
Eu não conhecia essa implementação de classe abstrata, mas o proprio facto dela ser abstract indica que não é um singleton.[/quote]
O problema é que você está olhando para o topo da hierarquia. Se for assim, o Java não tem singleton, pq todas as classes derivam de Object.
No enum, cada item da enumeração é implementado como uma subclasse. Por exemplo, isso:
enum Xyz { A, B, C};
Equivale a:
public abstract class Xyz
{
public static Xyz A = new XYZ() {}
public static Xyz B = new XYZ() {}
public static Xyz C = new XYZ() {}
}
Note que A, B e C são inner classes de Xyz. E o Java garante que o construtor de todos sejam private. Por isso, muitos autores dizem que A, B e C são singletons, porque cada inner class tem uma única instância.[/quote]
Ao fazer esses 3 new da classe vc está criando três instancias da mesma classe Xyz ( não estou pensando em object).
Vc pode argumentar que como Xyz é abstract então na realidade A, B e C são instancias de classes anonimas. Ok.
Para cada uma dessa classes anónimas existe apenas um objecto. Verdade.
En entendo que considere isso como sigleton , e é isso que eu estou dizendo que não é sigleton
Singleton não é apenas caracterizado por existir uma só instancia, tb por não poder existir nenhuma outra.
Quando vc tem uma só instancia, mas a capacidade de criar outras, mas escolhe instanciar apenas uma, isso é um Shared Object.
O ponto que me referi é que vc pode fazer isto :
Xyz a = Xyz.A
if (a != Xyz.B){
a = Xyz.B
}
System.out.print(a);
Isso vai escrever B e demonstra que a variável ‘a’ é polimorifca.
Ergo, é possivel ter mais do que uma instancia de Xyz simultaneamente
A, B e C são intancias de Xyz. Mesmo que herança ou classes anonimas no meio , continuam sendo instancias de Xyz.
Elas não são instancias de mais nenhum tipo. Mesmo com classes anonimas vc não pode invocar instanceOf para saber o tipo, logo
para todos os efeitos são instancias de Xyx.
Ergo, é possivel ter mais do que uma instancia de Xyz simultaneamente
Portanto, enum não são singleton, QED.
Como disse antes “enum é singleton” é uma antitese. É como “quente é frio”. Singleton tem o objetivo de ter apenas uma instancia possivel enquanto enum tem objetivo de ter várias instancias possiveis : uma para cada item da enumeração , tantas quanto necessário.