方法为Map Value的动态切换案例-Java

方法为Map Value的动态切换案例-Java,java,dynamic,switch-statement,maps,java.util.scanner,Java,Dynamic,Switch Statement,Maps,Java.util.scanner,所以我的小项目有一个扫描仪和两个重要的方法: 显示我可以在扫描仪中键入的命令(运行其他方法) 带命令的开关盒 以及以下代码: static void showCommands(){ System.out.println("You can enter the following commands: " + "\nCommands: Lists your commands. " + "\nInv

所以我的小项目有一个扫描仪和两个重要的方法:

  • 显示我可以在扫描仪中键入的命令(运行其他方法)
  • 带命令的开关盒
  • 以及以下代码:

    static void showCommands(){
        System.out.println("You can enter the following commands: "
                + "\nCommands: Lists your commands. "
                + "\nInventory: Opens up your inventory"
                + "\nEquipment: Let's you equip your items"
                + "\nSpawnItem: Spawns a random item in your inventory"
                + "\nTravel: Travels your character"
                + "\nLocate: Locates your character"
                + "\nClose: Exits the game");
        
        
    }
    
    static void useCommands() {
        String input = "";
        Scanner sc = new Scanner(System.in);
        while (!input.equals("Close")) {
            input = sc.next();
            switch (input) {
            case "commands":
                showCommands();
                break;
            case "combatlevel":
                CombatLevel.showCombatLevel();
                break;
            case "totatlevel":
                TotalLevel.showTotalLevel();
                break;
            case "inventory":
                Inventory.showInventory();
                break;
            case "equipment":
                Equipment.showEquipment();
                break;
            case "equip":
                break;
            case "spawnitem":
                Item.spawnItem();
                break;
            case "travel":
                Map.travel();
                break;
            case "increaselevel":
                Player.getInstance().combatLevel.increaseCombatLevel();
                break;
            case "locate":
                Map.locate();
                break;
            case "close":
                sc.close();
                System.exit(0);
                break;
            }
        }
    }
    
    问题是:架构太静态了,因为我总是需要为每个新命令和它本身相应地更新这两种方法,这让我觉得效率不高

    所以我想问一下,是否可以使用一个带有键的映射、扫描仪上用户输入的字符串以及作为映射值的动态启动方法

    比如:

    HashMap test=新的HashMap(); test.put(“test”,test())

    我试图这样做,但没有成功,因为我的test()方法必须返回另一个对我来说没有意义的方法。 有人对如何解决这个问题有什么建议吗


    Cheers

    定义一个名为
    Command
    的接口,该接口将表示所执行的操作。然后,您可以将相关命令存储在
    映射中,并将别名作为键。请随意查看,它可能有一些更有用和传统的设计

    接口命令{
    void execute();
    }
    类MyCommand实现命令{
    @凌驾
    public void execute(){
    }
    }
    
    Map命令=newhashmap();
    commands.put(“command”,new MyCommand());
    commands.put(“helloWorld”,()->System.out.println(“helloWorld”);
    Command=commands.get(“Command”);
    Command helloWorld=commands.get(“helloWorld”);
    command.execute();
    helloWorld.execute();
    
    您可以使用
    映射
    ,然后执行类似于
    Map.put(“foo”),()->doFoo())
    ,然后再执行
    Map.get(“foo”).run()
    。看到了吗?你能附上这个项目的zip文件链接吗?我想尝试一下,找出一个解决方案。当然,给我一分钟时间上传它。我的灵感来自老派runescape,只是一个小练习来训练我的开发技能,干杯。下面的例子很有意义,我完全明白了,但我不是这样为每个命令创建一个对象吗?这不是一个问题吗?Java每秒可以创建数百万个对象。这不是一个问题。最后一个问题:这样,对于一个命令来说,一切都非常好。但是如果我有更多,我将执行相同的execute();我的地图中每个键的方法,不是吗?我对设计模式和中间java相当陌生developing@Notorious正如Joni提到的,对象创建不是问题。关于您的问题,您正在对unique
    命令
    实现调用
    execute
    方法。除非多个键共享同一个命令引用,否则将引用该命令类的不同实例。