none
Singleton e Construtor Estático. RRS feed

  • Pergunta

  • Olaa,

    Sou iniciante em OO e estou estudando o o Padrão de Projeto Singleton, e entre suas inumeras implementações uma me chamou a atenção, conforme mostrado abaixo:

     

    public sealed class Singleton{
    
        private static readonly Singleton instance = new Singleton();
    
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Singleton()
        {
        }
    
        private Singleton()
        {
        }
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }


    De acordo com o exemplo mostrado seguem as dúvidas:

     

    1) O Exemplo é considerado Thread-Safe porque utiliza um Construtor Estático, pelo que pesquisei o Construtor Estático é usado para inicializar elementos estáticos ou para executar 1(uma) ação que precisa ser executada somente 1(uma) vez, outro ponto interessante é que os Construtores Estáticos são invocados quando uma intância da classe é criada ou um Membro Estático (propriedade ou método) da classe é invocado. Mas diante dessas informações ainda não está claro para mim como o uso de um Construtor Estático faz com que o exemplo seja considerado Thread-Safe, de forma a garantir a existência de somente uma instância da classe em questão, como isso é  possível ?? 

     

    2) No Exemplo mostrado foi criado separadamente um Static e um Private para o mesmo construtor, conforme mostrado abaixo:

    static Singleton() 
    {
    }
    
    private Singleton()
    {
    }

    Se houvesse a modificação, conforme mostrada abaixo:

    private static Singleton() 
    {
    }
    
    A respectiva mudança geraria algum problema ? ou Não afetaria em Nada ?

    3) O que realmente é beforefieldinit ? qual a real utilidade do mesmo ?

     

    Desde Já, Agradeço.

    sexta-feira, 30 de setembro de 2011 03:05

Respostas

  • Prezado Olavo Oliveira Neto,

     

    Muito obrigado pela atenção, mas referente a segunda pergunta, você sabe me informar se a mudança geraria algum problema ?

     

    Novamente Obrigado.

    • Marcado como Resposta _dev sábado, 8 de outubro de 2011 02:41
    sábado, 1 de outubro de 2011 04:22
  • faz sim, na verdade se você juntar o static com o private sua classe não irá compilar, pois ela não static ela não poderá ter um unico construtor singleton. agora sinceramente eu em vez de atribuir o valor logo, por que você não faz assim:

     public class Singleton
        {
            private Singleton() { }
    
            public static Singleton instancia = null;
    
            public static Singleton getInstancia()
            {
                if (instancia == null)
                    instancia = new Singleton();
                return instancia;
            }
        }
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    sábado, 1 de outubro de 2011 20:23
    Moderador

Todas as Respostas

  • Amigo, 

    O beforeFieldinit é uma forma de declaração, ao qual o método ou a váriavel será iniciada "CEDO", logo durante a inicialização da aplicação, veja o site: http://www.yoda.arachsys.com/csharp/beforefieldinit.html

    Essa classe pode ser considerada Thread-Safe por que, garante que somente uma objeto dela irá existir em memória.


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    sexta-feira, 30 de setembro de 2011 12:08
    Moderador
  • Prezado Olavo Oliveira Neto,

     

    Muito obrigado pela atenção, mas referente a segunda pergunta, você sabe me informar se a mudança geraria algum problema ?

     

    Novamente Obrigado.

    • Marcado como Resposta _dev sábado, 8 de outubro de 2011 02:41
    sábado, 1 de outubro de 2011 04:22
  • faz sim, na verdade se você juntar o static com o private sua classe não irá compilar, pois ela não static ela não poderá ter um unico construtor singleton. agora sinceramente eu em vez de atribuir o valor logo, por que você não faz assim:

     public class Singleton
        {
            private Singleton() { }
    
            public static Singleton instancia = null;
    
            public static Singleton getInstancia()
            {
                if (instancia == null)
                    instancia = new Singleton();
                return instancia;
            }
        }
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    sábado, 1 de outubro de 2011 20:23
    Moderador
  • Prezado Olavo Oliveira Neto,

     

    Muito obrigado por sua atenção, minha dúvida foi sanada.

     

    Novamente Obrigado.

    sábado, 8 de outubro de 2011 02:40