'this' внутри BukkitRunnable

Что означает ключевое слово this внутри org.bukkit.scheduler.BukkitRunnable?

public class Foo {
  protected Player player;

  public Foo(Player player) {
    this.player = player;
    BukkitRunnable runnable = new BukkitRunnable() {
      @Override
      public void run() {
        // does 'this' still refer to the instance of 'Foo' ?
        this.player.sendMessage("Hello");
      }
    };
  }
}

Будет ли вышеприведенный запускаемый объект отправлять сообщение проигрывателю, используемому для создания экземпляра этого Foo?

Почему бы вам не попробовать System.out.println(this.getClass().getName()) и не узнать себя?

SeverityOne 07.04.2018 00:48
"this" по-прежнему относится к экземпляру "Foo"? нет, но Foo.this делает. this относится к экземпляру BukkitRunnable. В вашем случае вы можете просто опустить this все вместе, поскольку параметр player неявно является окончательным, поскольку его значение никогда не изменяется (при условии, что Java 8, или вы можете сделать параметр playerfinal до Java 8). В вашем примере не имеет значения, используете ли вы player или Foo.this.player, поскольку они оба ссылаются на один и тот же объект.
d.j.brown 07.04.2018 01:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
149
2

Ответы 2

this относится к созданному вами экземпляру BukkitRunnable. Если вы хотите отправить проигрывателю сообщение, вы должны ссылаться на свой экземпляр Foo вместо ссылки на свой экземпляр BukkitRunnable.

Вы можете сделать это с помощью Foo.this. Так

Foo.this.player.sendMessage("Hello");

Может быть то, что вы ищете.

Но поскольку вы используете анонимный внутренний класс, вы можете получить доступ к любой переменной final из его области видимости, поэтому вы можете просто ссылаться на player без какого-либо ключевого слова this.

player.sendMessage("hello"); //inside BukkitRunnable

Как указывает @ d.j.brown, Java 8 предполагает неизменность player, и вам не нужно добавлять к нему ключевое слово final.

На самом деле у меня есть подкласс Foo, который устанавливает собственный this.player. Получит ли использование Foo.this.player правильное свойство экземпляра подкласса?

theonlygusti 07.04.2018 04:14

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

Другие вопросы по теме