Java Closure Scope - PullRequest
       10

Java Closure Scope

0 голосов
/ 19 декабря 2011

У меня есть следующий код:

package application;

import java.util.Timer;
import java.util.TimerTask;

public class Application {

       public String name = "Brad" ;

       public static void main ( String [ ] args ) {
              Timer time = new Timer ( );
              time.schedule ( new TimerTask ( ) {
                     @Override
                     public void run ( ) {
                            System.out.println( "Name: " ) ;
                     }
              }, 0, 10000 );

       }

}

как я могу получить доступ к методам и / или свойствам класса в функции run ()?честно говоря, я не знаю, как я могу получить доступ к контексту .. и не знаю, как передать объект в качестве параметра, как в PHP

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Вы можете получить доступ к переменным экземпляра, но в вашем случае вы не можете получить доступ к name, поскольку это не static. Если вы хотите использовать переменные поля, вам нужно объявить их как final, чтобы иметь возможность использовать их внутри анонимного класса.

Пример:

package application; 

import java.util.Timer;
import java.util.TimerTask;

public class Application {
  public static String name = "Brad" ;

  public static void main ( String [ ] args ) {
    final String lastName = "Brad's last name";

    Timer time = new Timer ( );
    time.schedule ( new TimerTask ( ) {
      @Override
      public void run ( ) {
        System.out.println( "Name: " + name + " " + lastName ) ;
      }
    }, 0, 10000 );
  }
}
1 голос
/ 19 декабря 2011

Вы реализуете метод в анонимном классе, который Java должен закрыть.Вы можете получить доступ к свойствам или методам приложения, вызвав его следующим образом:

Application.this.instanceExampleMethod();

или

Application.this.property;

Хотя ваш случай особенный, потому что вы используете статический метод, поэтому вы 'Вам нужно будет изменить методы на статические, если вы хотите их вызывать (или создавать экземпляр приложения и использовать его).

0 голосов
/ 19 декабря 2011

Вам необходимо создать экземпляр Application, на который TimerTask может ссылаться.В вашем коде нет такого экземпляра, потому что статические методы (например, main) не требуют его.Поэтому создайте экземпляр и объявите его как final, чтобы ваш анонимный TimerTask внутренний класс имел к нему доступ.

public class Application {

       private String name = "Brad" ;

       public String getName()
       {
         return name;
       }

       private void privateMethod() {}

       public static void main ( String [ ] args ) {
              Timer time = new Timer ( );
              final Application application = new Application(); // instance
              time.schedule ( new TimerTask ( ) {
                     public void run ( ) {
                            System.out.println( "Name: "  + application.getName());
                            application.privateMethod(); // don't rely on this
                     }
              }, 0, 10000 );
       }
}

Обратите внимание, что в вашем случае метод main определен внутри Application.Это означает, что внутри внутреннего класса TimerTask у вас будет доступ к закрытым (экземплярам) полям Application благодаря видимости на уровне класса в Java.В общем, вы не хотите полагаться на эту «функцию» и имеете доступ только к открытым методам на Application.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...