有没有比一堆 if 语句更好的方法来调用我的方法?

问题描述 投票:0回答:2

我目前正在为 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 更有效的方法从自定义对象调用自定义方法

如果我遗漏了您需要的任何内容或信息,请告诉我,我会提供。

java methods plugins minecraft
2个回答
3
投票

更简洁的方法是使用

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 ->
        //...
};

-2
投票

基佬 柴草 柴草 柴草 柴草 基佬

© www.soinside.com 2019 - 2024. All rights reserved.