有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建一个管理器类来保存某些变量而不滥用静态变量?

这里是javan00b。我正在为Minecraft服务器制作一个插件,我想使用一个类来保存插件的所有变量:

public class BwMgr {

    Boolean enabled = false;

    final HashSet<Player> red = new HashSet<>();
    final HashSet<Player> green = new HashSet<>();
    final HashSet<Player> blue = new HashSet<>();
    final HashSet<Player> orange = new HashSet<>();
    final HashSet<Player> purple = new HashSet<>();
    final HashSet<Player> yellow = new HashSet<>();
    final HashSet<Player> black = new HashSet<>();
    final HashSet<Player> white = new HashSet<>();

    public void assignTeams() {

    }

}

每个哈希集都应该包含一组玩家。其他类将访问布尔值以确定插件是否已启用:

public class BwListener implements Listener {

    private final BwMgr bwMgr = new BwMgr();

    @EventHandler
    public void onPlayerJoinEvent(PlayerJoinEvent e) {
        if (bwMgr.enabled) {
            // do stuff
        }
    }
}

enabled应在此处更新:

public class BwCmd implements CommandExecutor {

    private BwMgr bwMgr = new BwMgr();

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("bw")) {
            if (args[0].equalsIgnoreCase("enable")) {
                bwMgr.enabled = true;             
            } else if (args[0].equalsIgnoreCase("disable")) {
                bwMgr.enabled = false;
            }
        }
        return false;
    }
}

当然,因为每个类都使用不同的BwMgr实例,所以它们使用不同版本的布尔enabled。我可以把static放在BwMgr中所有东西的前面,但我觉得那是虐待。任何想法都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    您需要通过BwCmd和bwstener的构造函数传递相同的BwMgr实例

    所以在BwCmd中应该是这样的:

        public class BwCmd implements CommandExecutor {
    
        private BwMgr bwMgr;
    
        // Pass through the constructor an instance of BwMgr.
        public BwCmd(BwMgr bwMgr) {
            this.bwMgr = bwMgr;
        }
      
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("bw")) {
                if (args[0].equalsIgnoreCase("enable")) {
                    bwMgr.enabled = true;             
                } else if (args[0].equalsIgnoreCase("disable")) {
                    bwMgr.enabled = false;
                }
            }
            return false;
        }
    }
    

    BwListener类:

        public class BwListener implements Listener {
    
        private final BwMgr bwMgr;
        
        // Pass through the constructor an instance of BwMgr.
        public BwListener(BwMgr bwMgr) {
            this.bwMgr = bwMgr;
        }
    
        @EventHandler
        public void onPlayerJoinEvent(PlayerJoinEvent e) {
            if (bwMgr.enabled) {
                // do stuff
            }
        }
    }
    

    在你的主要课堂上:

    // Create one instance of bwMgr.
    BwMgr bwMgr = new BwMgr();
    
    // Initialize BwListener and BwCmd with the same BwMgr.
    BwListener bwListener = new BwListener(bwMgr);
    BwCmd bwCmd = new BwCmd(bwMgr);