Então agora escreva outro padrão de singleton mais popular, ou seja, o padrão de singleton enumerado.
O código para o modo de enumeração é o seguinte:
A data é para testar a conveniência.
enumeração pública EnumInstance { INSTANCE; data do objeto privado; public Object getDate () { data de retorno; } public void setDate (Data do objeto) { this.date = date; } public static EnumInstance getInstance () { return INSTANCE; } }
1. Em seguida, podemos escrever uma castanha serializada para teste.
public class SerivalTest { public static void main (String [] args) lança IOException, ClassNotFoundException { EnumInstance instance = EnumInstance.getInstance (); instance.setDate (new Object ()); // ObjectOutputStream outputStream = new ObjectOutputStream (new FileOutputStream ("single_file")); outputStream.writeObject (instância); // 文件 文件 File file = new File ("arquivo único"); ObjectInputStream inputStream = new ObjectInputStream (novo FileInputStream (arquivo)); EnumInstance hungrySingleton = (EnumInstance) inputStream.readObject (); System.out.println (instância); System.out.println (hungrySingleton); System.out.println (instância == hungrySingleton); } }
O resultado é:
Como é A enumeração é tão poderosa; então, como a serialização e a desserialização lidam com a enumeração? Primeiro, digite inputStream.readObject () e encontre o método readEnum ().
Como segue:
A constante de enumeração é obtida por tipo e nome, porque o nome na enumeração é único e corresponde a uma constante de enumeração; portanto, a linha 2012 é definitivamente o único objeto constante,
Dessa maneira, nenhum novo objeto é criado. O atributo singleton deste objeto é mantido. Esse método de processamento na enumeração ainda é muito simples e fácil de entender; portanto, a classe de enumeração é para serialização
Este dano não é afetado.
2. Escreva um exemplo de ataque de reflexão.
public class Testreflection { public static void main (String [] args) lança NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { Class object = EnumInstance.class; Construtor construtor = object.getDeclaredConstructor (); constructor.setAccessible (true); Instância EnumInstance = EnumInstance.getInstance (); EnumInstance newInstance = (EnumInstance) construtor.newInstance (); System.out.println (instance.getDate ()); System.out.println (newInstance.getDate ()); System.out.println (instance.getDate () == newInstance.getDate ()); } }
Veja o resultado:
Isso significa que nenhum construtor sem parâmetros é obtido; então, abrimos o código-fonte e damos uma olhada. java.lang.enum pode ver que a enumeração não possui construtor sem parâmetros e existe apenas um construtor com dois parâmetros, conforme mostrado abaixo. Em seguida, passaremos esses dois parâmetros e testaremos novamente.
Pode-se ver que uma exceção é lançada, mas pode-se entender claramente que essa exceção é que não pode ser refletida na criação de um objeto.Introduzimos o código-fonte no local em que o erro foi relatado para exibir os detalhes.
O código fonte nos diz claramente que, se for um tipo enumerado, uma exceção será lançada, mostrando quão poderosa é a enumeração!