我目前正在为 SpigotMC/Minecraft 编写一个插件。它是用 Java 编写的。
在我的代码中,发现在我的Github上我正在尝试根据玩家的输入调用不同的方法。
我目前的做法是获取他们执行的命令,然后使用 if else if 语句,如下所示:
if (args[0].equalsIgnoreCase("create"))
new SubCommandLootCrateCreate(plugin, sender, args).runSubCommand(false);
else if (args[0].equalsIgnoreCase("key"))
new SubCommandLootCrateKey(plugin, sender, args).runSubCommand(true);
else if (args[0].equalsIgnoreCase("add"))
new SubCommandLootCrateAdd(plugin, sender, args).runSubCommand(true);
else if (args[0].equalsIgnoreCase("remove"))
new SubCommandLootCrateRemove(plugin, sender, args).runSubCommand(false);
这样的行还有大约 10 条,而且看起来效率很低。如果您感到困惑,请随意探索我的项目,更好地了解我的意思。
这是 #runSubCommand(boolean) 的示例
public class SubCommandLootCrateCreate extends SubCommand
{
private String[] args;
private CommandSender sender;
private LootCrate plugin;
public SubCommandLootCrateCreate(LootCrate plugin, CommandSender sender, String[] args)
{
super(plugin, sender, args, Permission.COMMAND_LOOTCRATE_CREATE, Permission.COMMAND_LOOTCRATE_ADMIN);
this.plugin = plugin;
this.sender = sender;
this.args = args;
}
@Override
public void runSubCommand(boolean playerRequired)
{
//code
}
}
对于这种问题,有人有更好的解决方案吗?我希望看到我的代码变得更加高效。蒂亚!
TLDR;需要比 if else 更有效的方法从自定义对象调用自定义方法
如果我遗漏了您需要的任何内容或信息,请告诉我,我会提供。
更简洁的方法是使用
switch-case
,如下所示:
switch(args[0].toUpperCase()) {
case "CREATE":
new SubCommandLootCrateCreate(plugin, sender, args).runSubCommand(false);
break;
case "KEY":
new SubCommandLootCrateKey(plugin, sender, args).runSubCommand(true);
break;
case "ADD":
new SubCommandLootCrateAdd(plugin, sender, args).runSubCommand(true);
break;
case "REMOVE":
new SubCommandLootCrateRemove(plugin, sender, args).runSubCommand(false);
break;
//....
default:
//...
}
Java-14 及以上:
可以使用如上所示的 switch 语句,也可以使用如下所示的 switch 表达式:
switch(args[0].toUpperCase()) {
case "CREATE" -> new SubCommandLootCrateCreate(plugin, sender, args).runSubCommand(false);
case "KEY" -> new SubCommandLootCrateKey(plugin, sender, args).runSubCommand(true);
case "ADD" -> new SubCommandLootCrateAdd(plugin, sender, args).runSubCommand(true);
case "REMOVE" -> new SubCommandLootCrateRemove(plugin, sender, args).runSubCommand(false);
//....
default ->
//...
};
基佬 柴草 柴草 柴草 柴草 基佬