Enumeração de modo Singleton

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!

 

Acho que você gosta

Origin www.cnblogs.com/shenwen/p/12676720.html
Recomendado
Clasificación