当前位置: 首页 > 知识库问答 >
问题:

如何在从方法创建的类之间共享变量?

程景胜
2023-03-14

我正在为Minecraft创建一个插口插件,允许玩家使用某个命令追捕另一个玩家。

从现在开始,所有的变量都在类的顶部声明,这样它们就可以从onCommand方法中访问。但是,如果我这样做,插件将只适用于一个玩家,因为每个人的变量都是一样的,并且被每个使用命令的人覆盖(例如,所有玩家都将在命令上有一个冷却计时器,因为第一个玩家使用它)。我希望所有的变量都在onCommand方法中声明,这样变量的值对于使用命令的每个玩家来说都是唯一的。但是,如果我将它们移动到onCommand方法的顶部,我将无法再使用它们并获得以下错误(参见图片):

  • 变量“X”从内部类中访问,需要是final或有效final
  • 变量“X”可能尚未初始化

我还希望一些变量是公共的,这样就可以在另一个类中使用,但似乎不允许变量在方法内部是公共的(见图):

  • 此处不允许修饰符“public”

有人能帮我解决这三个问题吗?

下面的完整代码:

package com.krekkie.hunt.commands;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.text.MessageFormat;
import java.util.Timer;
import java.util.TimerTask;

public class HuntCommands implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] arguments) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("Only players can use that command!");
            return true;
        }
        Player player = (Player) sender;
        String playerName = player.getName();
        public Player targetPlayer;
        String targetPlayerName;
        World world = player.getWorld();
        long currentTime = world.getFullTime();

        Timer timer;
        public boolean isHunting = false;
        long fixedCooldownTime = 5*1000;
        long cooldownTime = 0;
        float cooldownTimeLeft;
        long huntStartTime = 0;

        // /hunt <player>
        if (command.getName().equalsIgnoreCase("hunt")) {
            if (!isHunting) {
                if (currentTime >= huntStartTime + cooldownTime) {
                    if (arguments.length == 1) {
                        targetPlayer = Bukkit.getPlayer(arguments[0]);
                        targetPlayerName = targetPlayer.getName();
                        try {
                            huntStartTime = world.getFullTime();
                            targetPlayer.sendMessage(MessageFormat.format("You are being hunted by {0}!", playerName));

                            timer = new Timer();
                            TimerTask timerTask = new TimerTask() {
                                int count = 0;

                                @Override
                                public void run() {
                                    Location targetPlayerLocation = targetPlayer.getLocation();
                                    float axisX = targetPlayerLocation.getBlockX();
                                    float axisY = targetPlayerLocation.getBlockY();
                                    float axisZ = targetPlayerLocation.getBlockZ();
                                    player.sendMessage(MessageFormat.format("You smell {0} at {1} {2} {3}", targetPlayerName, axisX, axisY, axisZ));

                                    count++;
                                    if (count >= 3) {
                                        timer.cancel();
                                        cooldownTime = fixedCooldownTime;
                                        player.sendMessage(MessageFormat.format("You cannot smell {0} anymore!", targetPlayerName));
                                        targetPlayer.sendMessage(MessageFormat.format("{0} lost your trace!", playerName));
                                        isHunting = false;
                                    }
                                }
                            };
                            timer.schedule(timerTask, 0, 10*1000);
                            isHunting = true;
                        } catch (IllegalArgumentException e) {
                            player.sendMessage("§c§l(!) §cInvalid argument!");
                        }
                    } else {
                        player.sendMessage("§c§l(!) §c/hunt <player>");
                    }
                } else {
                    cooldownTimeLeft = (float) Math.ceil(((huntStartTime + cooldownTime) - currentTime) / 1000);
                    player.sendMessage(MessageFormat.format("§c§l(!) §cYou need to wait {0} more minutes!", cooldownTimeLeft));
                }
            } else {
                player.sendMessage("§c§l(!) §cYou are already hunting someone!");
            }
        }

        // /huntstop
        if (command.getName().equalsIgnoreCase("huntstop")) {
            if (isHunting) {
                timer.cancel();
                cooldownTime = fixedCooldownTime;
                player.sendMessage(MessageFormat.format("You cannot smell {0} anymore!", targetPlayerName));
                targetPlayer.sendMessage(MessageFormat.format("{0} lost your trace!", playerName));
                isHunting = false;
            } else {
                player.sendMessage(("You are not hunting anyone!"));
            }
        }

        return true;
    }
}

共有1个答案

东方夕
2023-03-14

您可以创建包含静态字段的助手类。这可以简单地由两个类同时共享。小心这样的“黑客”。创建这样的意大利式代码真的很容易。此外,由于每个线程都可以随时更改这样一个全局公共变量,因此多线程将变得困难。

public classA {
    ....
    Helper.setInt(42);
    ....
} 

public classB {
    ....
    Helper.getInt(); // will return 42 if the call in classA was done before 
    ....
} 


public class Helper {
    public static int someInt = 0;

    public static int getInt() {
        return someInt;
    };

    public static void setInt(int value) {
        someInt = value;
    };
}
 类似资料:
  • 问题内容: 我正在使用“线程”模块在Python中进行项目。 如何创建一个全局变量(在我的情况下,我需要为True或False),以便项目中的所有线程(大约4-6)都可以访问? 问题答案: 我们可以在线程类外部定义变量,并在类的方法内部全局声明它。 请参见下面的简单示例,它交替打印AB。两个变量和在两个线程和之间共享。打印,然后设置为30。打印,因为已在中进行了修改。然后设置为20,再次用于中。这

  • 问题内容: 我最近一直在学习Swift。 我决定编写一个混合的Swift / Objective-C应用程序,该应用程序使用两种语言实现的相同算法来完成计算密集型任务。 该程序将计算大量的质数。 我定义了一个计算对象的Swift版本和Objective-C版本都应该遵守的协议。 这些对象都是单例,因此我在Objective-C中创建了一个典型的单例访问方法: 整个协议如下所示: 该类的Object

  • 问题内容: 我有一个下载器功能,可以并行下载多个文件。我使用以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数()。 是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数? 问题答案: 解决方案是利用新进程并传递共享的ctypes值:

  • 我需要将xml转换为jpa实体。我已经使用jaxb获取了我的DTO,并使用mapstruct将dto转换为实体。但是,我需要从数据中提取一些数据,并将其设置为实体上的列表。我的映射器如下所示 我不知道如何在提取MetaData方法中访问我的实体特别。

  • 本文向大家介绍详解如何在Javascript和Sass之间共享变量,包括了详解如何在Javascript和Sass之间共享变量的使用技巧和注意事项,需要的朋友参考一下 在环境之间共享变量是编程的圣杯。以下是在Javascript和 Sass(或CSS!)之间共享变量的方法。 随着大型单页应用程序的兴起,Javascript和CSS越来越交织在一起。通常在两个值之间复制值(例如,与React的CSS

  • 在运行之后,在JS中提交表单。 如何防止提交表单后刷新页面? 如何将数组传递回JS? 代码更新: