2012-01-27 3 views
2

Je connais le concept de singleton en Java. J'ai des problèmes avec la création de singleton comme classe interne en Java. Un problème se produit au niveau du supportJava singleton classe interne

public class NormalClass { 
    private class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

     public static Singleton getInstance() { 
      return NormalClass.Singleton.SingletonHolder.sessionData; 
     } 
    } 

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 

Erreur lors de l'appel du nouveau constructeur Singleton(). Comment appeler le constructeur privé de Singleton comme classe interne?

Cordialement

Répondre

7

Si ce doit être un vrai singleton, faites votre classe singleton. Ensuite, vous serez en mesure d'appeler le constructeur.

La raison pour laquelle votre appel de constructeur ne fonctionne pas est expliquée dans le didacticiel Java nested classes. En fait, la classe interne nécessite une instance de la classe externe avant qu'il puisse être construit:

private static Singleton sessionData = new NormalClass().new Singleton(); 
2

Vous ne pouvez pas déclarer des classes statiques dans une classe non statique. Rendez la classe Singleton statique et tout devrait bien se compiler.

1

Le problème est que la classe interne n'est pas classe interne statique,

public class NormalClass { 
    private static class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

     public static Singleton getInstance() { 
      return NormalClass.Singleton.SingletonHolder.sessionData; 
     } 
    } 

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 
0

Initialiser à la demande .... Joshua Bloch ..

Je pense que si votre classe interne est statique, votre support La classe devrait aussi être statique.

private static class SingletonHolder { 
    static final Singleton instance = new Singleton(); 
} 

Ou Pourquoi pas? pourquoi une classe de détenteurs internes du tout?

public class NormalClass{ 
    private static class InnerClass{ 
    private static InnerClass instance = null; 
    private InnerClass(){} 
    public static InnerClass getInstance() { 
    if(null==NormalClass.InnerClass.instance){ 
    NormalClass.InnerClass.instance = new InnerClass(); 
    } 
    return NormalClass.InnerClass.instance; 
} 
    } 

    public void test(){ 
    InnerClass.getInstance(); 
    } 
}