Ajudinha na estruturação com polimorfismo

Galera, boa tarde!

Gostaria de uma ajuda de vocës, é o seguinte:

Estou desenvolvendo uma tela, onde o usuário irá selecionar um determinado relatório (JList), irá preenhcer os filtros (caso queira) e posteriormente irá clicar em executar.

Comecei a desenvolver e estou incomodado com tantos IF’s e Switchs que estou utilizando, acredito que haja uma melhor forma para fazer isso…

Eu cheguei a ler o tópico http://www.guj.com.br/java/55885-como-nao-utilizar-if-ou-switch porém não consegui trazer para o contexto da minha tela (devo ser burro mesmo…rs)

Gostaria que quando a tela fosse aberta o JLIST fosse preenchido com os possíveis relatórios no sistema (isso não vem de nenhuma base) é colocada manualmente, veja abaixo:

    this.listaRelatorios.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultListModel modeloListaRelatorios = new DefaultListModel();
        modeloListaRelatorios.addElement(DadosTiposRelatorios.RELATORIO_A.getLabel());
        modeloListaRelatorios.addElement(DadosTiposRelatorios.RELATORIO_B.getLabel());
        modeloListaRelatorios.addElement(DadosTiposRelatorios.RELATORIO_C.getLabel());
        modeloListaRelatorios.addElement(DadosTiposRelatorios.RELATORIO_D1.getLabel());
        this.listaRelatorios.setModel(modeloListaRelatorios);

O JList é preenchido com base no enumerado abaixo:

public enum DadosTiposRelatorios {

    RELATORIO_A("Relatorio A", 1),
    RELATORIO_B("Relatorio B", 2),
    RELATORIO_C("Relatorio C", 3);

final private String label;
    final private int codigo;

    private DadosTiposRelatorios(String label, int codigo) {
        this.label = label;
        this.codigo = codigo;
    }

    public String getLabel() {
        return label;
    }

    public int getCodigo() {
        return codigo;
    }

public static DadosTiposRelatorios getRelatorio(int codigo) {
        switch (codigo) {
            case 0:
                return RELATORIO_A;
            case 1:
                return RELATORIO_B;
            case 2:
                return RELATORIO_C;
        }
        return null;
    }
}

Queria saber qual a melhor prática para desenvolver essa tela, eu sinceramente não gosto de IF’s e Switchs gigantescos (nessa minha tela, terão mais de 20 relatórios).

Existe alguma forma de estruturação de código que com base no relatório selecionado o mesmo executará o método de exibição do mesmo (lembrando que os relatórios são em Jasperreports)…

alguém pode me dar uma luz???

No código que postou não há IFs e apenas um switch. Acho que faltou mostrar o ponto que realmente te incomoda. Mas tem como dar jeito no switch sim.

Aqui você pode trocar esses addElement por um for com todos os valores de DadosTipoRelatorios. Algo como:

  for(DadosTiposRelatorios dados : DadosTiposRelatorios.values() ) {
    ...addElement(dados.getLabel());
  }

Esse switch também pode ser eliminado (usando for - if) da mesma forma como feito acima (com a vantagem de não precisar mexer mais se adicionar novos relatórios) :

  public static DadosTiposRelatorios getRelatorio(int codigo) {
    for(DadosTiposRelatorios dados : values() ) {
      if (dados.codigo == codigo)
        return codigo;
      return null; //Eu criaria uma opção DEFAULT ou NONE na enum para esse tipo de caso.
    }
  }

Você pode criar uma interface para executar o relatório, ter uma implementação para cada tipo diferente e registrar essa implementação como um terceiro atributo na sua enum.
Com isso, você deixa o método exibeRelatório direto na enum, que vai executar uma implementação diferente de acordo com a enum selecionada:

  public interface ExibidorRelatorio { void exibeRelatorio(parametrosNecessarios) }

  public enum DadosTiposRelatorios {
    RELATORIO_A ("Relatorio A", 1, new ExibidorRelatorioA() ),
    RELATORIO-B ("Relatorio B", 2, new ExibidorRelatorioB() )...
  }

Amigos,

eu consegui colocar a cabeça pra funcionar com o exemplo do viny godoy e funcionou perfeitamente…

só faltou eu colocar minha mente pra funcionar!!

desculpe o transtorno!!

valeu!!

Opa AbelBueno,

Desculpe-me não vi que havia respondido.

Muito obrigado. :slight_smile:

Eu consegui resolver utilizando a dica do Viny Godoy…

:slight_smile:

Mesmo assim muito obrigaod :slight_smile: