Dica Java nº 3. Como implementar “switch” dinâmico.

Na linguagem Java existe a palavra-chave “switch” e todos (todos os desenvolvedores relacionados a Java) sabem como ela funciona. No entanto, e se alguns casos não forem conhecidos na etapa de compilação? E se quisermos adicionar casos dinamicamente? A resposta é fácil – implemente seu próprio mecanismo de “troca”.

Precisamos de alguma interface que significa comando de caso.

interface Command {
void execute();
}

Precisamos de uma classe que implementa a interface Command e na chamada do método de execução não fará nada (padrão caso especial ).

class DoNothingCommand implements Command {
@Override public void execute() {}
}

Agora, estamos prontos para implementar a classe Switcher .

class Switcher {

private Map<Integer, Command> caseCommands;

private Command defaultCommand;

private Command getCaseCommandByCaseId(Integer caseId) {
if (caseCommands.containsKey(caseId)) {
return caseCommands.get(caseId);
} else {
return defaultCommand;
}
}

public Switcher() {
caseCommands
= new HashMap<Integer, Command>();

setDefaultCaseCommand
(new DoNothingCommand());
}

public void addCaseCommand(Integer caseId, Command caseCommand) {
caseCommands
.put(caseId, caseCommand);
}

public void setDefaultCaseCommand(Command defaultCommand) {
if (defaultCommand != null) {
this.defaultCommand = defaultCommand;
}
}

public void on(Integer caseId) {
Command command = getCaseCommandByCaseId(caseId);

command
.execute();
}
}

Agora, estamos prontos para escrever a classe principal.

public class Main {
public static void main(String[] args) {
Switcher switcher = new Switcher();
switcher
.addCaseCommand(1, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 1}");
}
});
switcher
.addCaseCommand(2, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 2}");
}
});
switcher
.addCaseCommand(3, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 3}");
}
});
switcher
.setDefaultCaseCommand(new Command() {
@Override
public void execute() {
System.out.println("Command on {default}");
}
});

for (int i = 1; i <= 4; i++) {
switcher
.on(i);
}
}
}

// output
Command on {id: 1}
Command on {id: 2}
Command on {id: 3}
Command on {default}