CDI x Herança e Polimorfismo

E aê pessoal!

Queria opiniões de vocês quanto ao uso do CDI nas questões de Herança e Polimorfismo entre classes.
Não sei se estou entendendo direito, com o uso de qualificadores (Qualifier) você só diz ao CDI que para a interface XPTO, eu quero utilizar a implementacao XPTOImpl…
Não consigo entender onde poderia ajudar na questão de herança e polimorfismo, tendo em vista que as outras implementações são “descartadas”
quando utilizarmos a interface XPTO, tendo que fazer a utilização direta da classe XPTOImpl2, por exemplo…

Exemplo:


public class ClasseA{

	//Interface que foi sinalizada que quero a implementação 1
	@Inject
	@ImplQueQuero
	private ClasseB classeB;

	//Injeção direta da implementação 2
	@Inject
	private ClasseBImpl2 classeBImpl2;

//...
}


@ImplQueQuero
public interface ClasseB{

}



@Qualifier
@Retention(RUNTIME)
@Target( { TYPE, METHOD, PARAMETER, FIELD })
public @interface ImplQueQuero{}


@ImplQueQuero
public class ClasseBImpl1 implements ClasseB{
//......
}


public class ClasseBImpl2 implements ClasseB{
//......
}

// Implementações N

Existe alguma outra forma de resolver isso? Porque assim, não enxergo a vantagem em utilizar a interface Classe B se tenho que injetar as Implementações…

Vlw galera!

:wink:

Em teoria, quando você utiliza o artificio de DI, sua interface deve ser implementada em uma única classe.

Se você tiver duas classes implementando a mesma interface, o container não saberá qual implementação deve ser injetada.

Isso normalmente funciona assim com o uso do Spring Framework.

Vê se assim fica mais claro.

[code]public interface FormaPagamento {

}

@Qualifier
@Retention(RUNTIME)
@Target( { TYPE, METHOD, PARAMETER, FIELD })
public @interface PagamentoCartao{}

public @interface PagamentoCheque{}

public @interface PagamentoDinheiro{}

@Named
@PagamentoCartao
public class FormaPagamentoCartao implements FormaPagamento{}

@Named
@PagamentoCheque
public class FormaPagamentoCheque implements FormaPagamento{}

@Named
@PagamentoDinheiro
public class FormaPagamentoDinheiro implements FormaPagamento{}

@Named
public class ExecutorPagamento {
@Inject
@PagamentoCartao
private FormaPagamento formaPagamentoCartao;

@Inject
@PagamentoCheque
private FormaPagamento formaPagamentoCheque;

@Inject
@PagamentoDinheiro
private FormaPagamento formaPagamentoDinheiro;
}[/code]

Dessa forma temos 3 implementações para a mesma interface, sem o qualificador o container vai ter problema para injetar, pois 3 interfaces atendem.

Isso daria pau.

@Named public class ExecutorPagamento { @Inject private FormaPagamento formaPagamento; }

Qual é exatamente o problema?

[quote=novata]E aê pessoal!

Queria opiniões de vocês quanto ao uso do CDI nas questões de Herança e Polimorfismo entre classes.
Não sei se estou entendendo direito, com o uso de qualificadores (Qualifier) você só diz ao CDI que para a interface XPTO, eu quero utilizar a implementacao XPTOImpl…
Não consigo entender onde poderia ajudar na questão de herança e polimorfismo, tendo em vista que as outras implementações são “descartadas”
quando utilizarmos a interface XPTO, tendo que fazer a utilização direta da classe XPTOImpl2, por exemplo…
[/quote]

Vc tem razão, não faz sentido mesmo. Mas o CDI não sabe exactamente qual é a implementação. Se vc mover a anotação @ImplQueQuero para outra classe, será essa que será usada.
O polimorfismo está em fucnionamento porque vc pode mudar , não porque vc vai mudar.

Por outro lado, isto acontece assim pq está usando anotações. Se vc usar configuração por arquivo não fica nada nas classes e vc pode modificar por detrás dos panos.
Para modificar dinamicamente, ou seja, dependendo de alguma variável uma implementação é injetada em vez da outra, vc precisa usar uma fábrica.
Mas o caso de uso mais comum é realmente uma interface + uma implementação e é nisso que o mecanismo foca.

Mas isto não significa que o mecanismo é inutil , como foi desmonstrado aqui, o Qualifier tem usos reais que não passam pelo problema que citou.

Ou seja, parece um problema à primeira vista, mas realmente não é.

[quote=sergiotaborda][quote=novata]E aê pessoal!

Queria opiniões de vocês quanto ao uso do CDI nas questões de Herança e Polimorfismo entre classes.
Não sei se estou entendendo direito, com o uso de qualificadores (Qualifier) você só diz ao CDI que para a interface XPTO, eu quero utilizar a implementacao XPTOImpl…
Não consigo entender onde poderia ajudar na questão de herança e polimorfismo, tendo em vista que as outras implementações são “descartadas”
quando utilizarmos a interface XPTO, tendo que fazer a utilização direta da classe XPTOImpl2, por exemplo…
[/quote]

Vc tem razão, não faz sentido mesmo. Mas o CDI não sabe exactamente qual é a implementação. Se vc mover a anotação @ImplQueQuero para outra classe, será essa que será usada.
O polimorfismo está em fucnionamento porque vc pode mudar , não porque vc vai mudar.

Por outro lado, isto acontece assim pq está usando anotações. Se vc usar configuração por arquivo não fica nada nas classes e vc pode modificar por detrás dos panos.
Para modificar dinamicamente, ou seja, dependendo de alguma variável uma implementação é injetada em vez da outra, vc precisa usar uma fábrica.
Mas o caso de uso mais comum é realmente uma interface + uma implementação e é nisso que o mecanismo foca.

Mas isto não significa que o mecanismo é inutil , como foi desmonstrado aqui, o Qualifier tem usos reais que não passam pelo problema que citou.

Ou seja, parece um problema à primeira vista, mas realmente não é.[/quote]

Certo pessoal.

A dúvida era realmente saber se isso não era possível, pois como um colega falou aí em cima, usávamos Spring, e essa abordagem funcionava perfeitamente…

Obrigada pela opiniões!

:wink: