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…
@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;
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 é.
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…