Referencing 'this' from a class that is not extending JavaPlugin

旧街凉风 提交于 2019-12-12 02:27:02

问题


I am trying to make a plugin that starts a Scheduler task with this method:

public void newCountdown() {
    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
        public void run() {
            for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                player.sendMessage("Hey");
            }
        }                   
}, 0, 20);
}

The problem is, when I try to call the method, it says it needs to be a static method. Then, when i change it to static the first parameter "this" says it cannot be used in a static context.

When the method is not static, the scheduleSyncRepeatingTask shows this error:

The method scheduleSyncRepeatingTask(Plugin, Runnable, long, long) in the type BukkitScheduler is not applicable for the arguments (activateDevMode, new Runnable(){}, int, int)

When I try any of the quick fixes it gives me, it will always result in another error.

Is there a way to reference this from the Main class without having to make my method static?


回答1:


The reason this isn't working is because static and this never go together. An easy way to think about it is that static removes the object-oriented part of Java. this is a keyword that points to the current instance of your class, and cannot be used with static because using a static variable is like completely removing instances all together.

You will have to change this to an instance of your Main class (the one that extends JavaPlugin). You can initialize a static variable onEnable() to store the instance

public static Main that; //"Main" will be replaced with the name of your Main class

@Override
public void onEnable(){
    //set that to an instance of your Main class (this)
    that = this;
}

@Override
public void onDisable(){
    //set that to null to prevent memory leaks
    that = null;
}

Now, you can make your newCountdown() method static by replacing that with this

public static void newCountdown() {
    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Main.that, new Runnable() {
        public void run() {
            for(Player player : Bukkit.getServer().getOnlinePlayers()){
                player.sendMessage("Hey");
            }
        }                   
    }, 0, 20);
}


来源:https://stackoverflow.com/questions/31257935/referencing-this-from-a-class-that-is-not-extending-javaplugin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!