передача "this" в this () o super () - PullRequest
3 голосов
/ 27 июня 2010

Мои вопросы таковы:

почему нельзя передать this для явного вызова конструктора? Пример:

class MyClass {

    MyClass x;

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

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

}

Ответы [ 2 ]

4 голосов
/ 27 июня 2010

Вы пытаетесь передать ссылку на this из конструктора в другой конструктор в том же экземпляре.

В Java вы не можете получить явный или неявный доступ к this в конструкторе, прежде чем вернуться из неявногоили явный вызов this() или super().Это связано с тем, что суперкласс еще не инициализирован.

Возможно, вам потребуется продублировать код в конструкторе:

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

Могут быть способы его обойти с помощью частного конструктора, нотогда вы попадаете на хакерскую территорию.

0 голосов
/ 28 июня 2010

Ниже обойдено это ограничение.

Обходное решение - передать объект временного держателя конструктору суперкласса.Затем, после того как конструктор суперкласса выполнил свою работу, передайте объекту временного держателя ссылку на него.

Параметр delta может использоваться для демонстрации основного недостатка этого обходного пути - что, если конструктор суперкласса должен использоватьпараметр.

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" ) ;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...