2010-06-27 4 views
3

Mes questions est la suivante:"this" à ce() o super()

pourquoi ne peut pas passer "ce" à un appel explicite à un constructeur? exemple:

class MyClass { 

    MyClass x; 

    public MyClass(MyClass c){ 
     x=c; 
    } 

    public MyClass(){ 
     this(this);  //error 
    } 

} 
+3

Il est très déroutant de commencer une question avec "parce que". Qu'est-ce que tu veux faire? –

+0

Je ne pense pas que ce soit une question? –

+0

Je ne dois rien faire, laissez-moi savoir pourquoi cette chose – kafka

Répondre

4

Vous essayez de passer une référence à this d'un constructeur à un autre constructeur sur la même instance.

En Java, vous ne pouvez pas accéder this implicitement ou explicitement dans le constructeur avant de revenir d'un appel implicite ou explicite à this() ou super(). C'est parce que la super classe n'a pas encore été initialisée.

Vous devrez peut-être dupliquer du code dans le constructeur:

class MyClass { 
    private final MyClass myInstance; 
    public MyClass(MyClass myInstance) { 
     this.myInstance = myInstance; 
    } 
    public MyClass() { 
     this.myInstance = this; 
    } 
} 

Il peut y avoir des moyens de pirater autour de l'aide d'un constructeur privé, mais vous êtes en territoire de piratage.

+1

Ne devrait pas 'this.myInstance = null;' être 'this.myInstance = this;'? –

+0

Tom Hawtin merci pour la réponse – kafka

+0

@Stephen C Oui. –

0

Ci-dessous est un travail autour de cette restriction.

Le travail consiste à passer un objet titulaire temporaire au constructeur super classe. Ensuite, après que le constructeur de la super classe a fait son travail, donnez une référence à l'objet titulaire temporaire.

Le paramètre delta peut être utilisé pour montrer le principal défaut de cette solution de contournement - et si le constructeur de la superclasse devait utiliser le paramètre.

import java . lang . reflect . * ; 
import java . util . * ; 

class Father 
{ 
    public static void main (String [ ] args) 
    { 
     (new Son (args . length > 0)) . run () ; 
    } 

    Father (Runnable runnable , boolean delta) 
    { 
     super () ; 
     if (delta) 
     { 
     runnable . run () ; 
     } 
    } 
} 

class Son extends Father implements Runnable 
{ 
    private static Map < Thread , TempRunnable > temps = new HashMap < Thread , TempRunnable > () ; 

    private static class TempRunnable implements Runnable 
    { 
     private Son son ; 

     TempRunnable () 
     { 
      super () ; 
      temps . put (Thread . currentThread () , this) ; 
     } 

     public void run () 
     { 
      son . run () ; 
     } 
    } 

    Son (boolean delta) 
    { 
     // super (this) ; // the dream 
     super (new TempRunnable () , delta) ; 
     temps . get (Thread . currentThread ()) . son = this ; 
    } 

    public void run () 
    { 
     System . out . println ("Hello World") ; 
    } 
} 
Questions connexes