3
respostas

Dúvida newInstance()

try {


            Class classe = Class.forName(nomeDaClasse); // Nome da Classe que será Utilizada

            Acao acao = (Acao) classe.newInstance(); // Executa o método desta casse que no caso é executa, uma interface

            nomePagina = acao.executa(request, response); // Retorna o nome da página

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            throw new ServletException(e);

        } 

Olá Aluleiros, No código automatizei minha Servlet entrada para instanciar de forma automática minhas classes e chamar seu método executa. Me surgiu a seguinte dúvida.

1 - Por qual motivo devo guardar minha instância da classe na Acao acao = (Acao) classe.newInstance();

2 - É possível criar a instância sem ter que invocar a Acao (interface)? Pois ja que o método executa esta presente em todos as classes, não entendo o motivo de ter que invocar ela primeiro.

Obrigado pela atenção.

3 respostas

Oi Luciano! Tudo bem?

1)

Você precisa guardar a referencia para o objeto Acao porque você executa o método de Acao na linha seguinte que ela foi criada.

Outra alternativa seria fazer as chamadas em conjunto na mesma linha, tipo assim:

String nomeDaPagina = ((Acao) classe.newInstance()).executa(request, response);

2)

Apesar de funcionar, não é uma boa prática de programação misturar criação de objetos e a invocação (chamada) de seus comportamentos. É importante ter em mente que:

Construtor foi criado para realizar tarefas relacionadas a construção do Objeto.

Métodos são comportamentos que serão chamados para um objeto existente.

Espero ter ajudado,

Abraço e sucesso,

Rodrigo

Boa tarde Rodrigo, Como eu faria para invocar o método executa da classe instância sem precisar invocar a Interface Acao. No caso que citei invoquei a Interface Acao (Acao acao = (Acao)) e logo após a instância da classe (Acao acao = (Acao) classe.newInstance()). Obrigado pela ajuda, não sei se consegui explicar de forma clara.

Oi Luciano,

A vantagem que fazer o cast para a interface e não a classe, é que você não precisa conhecer quantas implementações existem, apenas saber que toda a classe que implementa essa interface é chamada de forma igual.

Exemplo sem uso de interface:

AcaoTipo1 acao1 = (AcaoTipo1) Class.forName("br.com.alura.AcaoTipo1").newInstance();
acao1.execute(request, response);

AcaoTipo2 acao2 = (AcaoTipo2) Class.forName("br.com.alura.AcaoTipo2").newInstance();
acao2.execute(request, response);

AcaoTipo3 acao3 = (AcaoTipo3) Class.forName("br.com.alura.AcaoTipo3").newInstance();
acao3.execute(request, response);

Acessar o método pela interface e não pela classe.

Acao acao = (Acao) Class.forName("br.com.alura.AcaoTipo1").newInstance();
acao.execute(request, response);

acao = (Acao) Class.forName("br.com.alura.AcaoTipo2").newInstance();
acao.execute(request, response);

acao = (Acao) Class.forName("br.com.alura.AcaoTipo3").newInstance();
acao.execute(request, response);

Com a utilização de interfaces, você cria um contrato que todas as classes de ação precisam cumprir, assim sendo, não importa qual implementação você está utilizando, a chamada é a mesma.

Espero ter ajudado,

Abraço!

Rodrigo

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software