方法为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
方法。除非多个键共享同一个命令引用,否则将引用该命令类的不同实例。