Что означает ключевое слово 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?
Foo.this делает. this относится к экземпляру BukkitRunnable. В вашем случае вы можете просто опустить this все вместе, поскольку параметр player неявно является окончательным, поскольку его значение никогда не изменяется (при условии, что Java 8, или вы можете сделать параметр playerfinal до Java 8). В вашем примере не имеет значения, используете ли вы player или Foo.this.player, поскольку они оба ссылаются на один и тот же объект.




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 правильное свойство экземпляра подкласса?
this внутри BukkitRunnable относится к созданному вами экземпляру BukkitRunnable.
В этом случае достаточно просто сослаться на player.
В противном случае используйте OuterClass.this для ссылки на экземпляр currnet из внутреннего класса. В этом случае вы должны использовать Foo.this.player для получения плеера.
Почему бы вам не попробовать
System.out.println(this.getClass().getName())и не узнать себя?