Java >> Java opplæring >  >> Java

Finnes det en bedre måte enn en haug med if-utsagn å kalle metodene mine?

Jeg skriver for tiden en plugin for SpigotMC/Minecraft. Den er skrevet i Java.

I koden min, funnet på Github, prøver jeg å kalle en annen metode avhengig av hva spillerens inngang var.

Min nåværende måte å gjøre dette på er å ta tak i kommandoen de utførte, og så bare bruke og hvis annet if-setning som ser omtrent slik ut:

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);

Det er omtrent 10 flere linjer som dette, og det virker bare veldig ineffektivt. Utforsk gjerne prosjektet mitt mer for å få en bedre ide om hva jeg mener hvis du er forvirret.

Her er et eksempel på #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
    }
}

Kan noen ha en bedre løsning på denne typen problemer? Jeg vil gjerne se at koden min blir mer effektiv. TIA!

TLDR; Trenger en mer effektiv måte enn om annet å kalle tilpassede metoder fra tilpassede objekter

Hvis jeg mangler noe eller annen informasjon du trenger, vennligst gi meg beskjed, så skal jeg gi det.

Svar

En renere tilnærming vil være å bruke switch-case som vist nedenfor:

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 og utover:

Du kan bruke switch-setningen som vist ovenfor eller bruke switch-uttrykket som vist nedenfor:

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 Tag