我目前正在为 SpigotMC/Minecraft 编写一个插件。它是用 Java 编写的。
在我的代码中,找到 on my 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
}
}
有没有人可以更好地解决此类问题?我希望看到我的代码变得更加高效。 TIA!
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 ->
//...
};
关于java - 有没有比一堆 if 语句更好的方法来调用我的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65944000/