Gostaria de saber qual diferença prática e conceitos nas seguintes utilizações:
1º Caso
public class Programa{
private static EntityManager em3;
public static void main(String[] args){
EntityManagerFactory factory3 = Persistence.createEntityManagerFactory("pu3");
em3 = factory3.createEntityManager();
Objeto objeto = new Objeto().setEM(em3).executa();
}
}
public class Objeto{
private static EntityManager em3;
public Objeto setEm3(EntityManager em3) {
this.em3 = em3;
return this;
}
public Objeto executa(){
em3.getTransaction().begin();
//rotinas...
em3.getTransaction().commit();
return this;
}
}
e
2º Caso
public class Programa{
private static EntityManager em3;
public static void main(String[] args){
EntityManagerFactory factory3 = Persistence.createEntityManagerFactory("pu3");
em3 = factory3.createEntityManager();
Objeto objeto = new Objeto().executa();
}
public static final EntityManager getEM(){
return em3;
}
}
public class Objeto{
public Objeto executa(){
Programa.getEM().getTransaction().begin();
//rotinas...
Programa.getEM().getTransaction().commit();
}
}
Estou pensando na utilização do segundo Caso, pois será necessário a utilização do EntityManager em vários outros objetos, então ao invés de sempre setar no objeto a ser utilizado, passaria somente a buscar o existente e não setar um atributo novo para cada objeto que vá utilizar o EntityManager.
Porém que tipo de problemas poderia ter.
Obrigado pela atenção.
Corrijam se estiver errado, mas vejo a 1meira maneira melhor, porque tem menos dependência entre os objetos.
E ela lembra vagamente o conceito de injeção de dependencia (DI, um tipo de inversao de controle - IoC), nessa talvez eu tenha dito besteira =P
Quanto à independência dos objetos, correto, a 1a eh melhor nesse sentido. Contudo, você tem um problema sério ali: o fato do em ser static quer dizer que ele vai ser compartilhado por todas as instâncias, e moral da história que se chegar um “desavisado” alí no meio e setar null no seu em… problemas.
Acho que o ideal seria você implementar uma factory para estes objetos. Você retornaria instâncias de objeto já com seus campos em devidamente preenchidos. E não teria overhead, já que a sua fábrica poderia ajustar o mesmo em em todas as instâncias (passagem por referência). Lembre- se de tirar o static do seu em.
[]´s
[quote=A.L]Corrijam se estiver errado, mas vejo a 1meira maneira melhor, porque tem menos dependência entre os objetos.
E ela lembra vagamente o conceito de inversão de dependecia (DI), nessa talvez eu tenha dito besteira =P[/quote]
Vc está certo.
O primeiro caso mostra injeção de dependencia.
O segundo mostra o uso de um tipo de ServiceLocator.
Injeção é sempre melhor que service locator.
mas ha um detalhes, mas usar injeção é preciso estar num ambiente controlado, servicelocator usa-se quando está fora desse ambiente. então, se existe o ambiente ou ha como o criar, injeção é o cara.
Senão ainda usaremos injeção, mas antes invocaremos um service locator.
é por isso que os motores de injeção são importantes, eles minimizam o trabalho de amarrar as coisas.
O argumento “vou ter que usar em todo o lugar” pesa a favor da injeção e não do servicelocator.
Repare que mesmo na ausencia de um motor de injeção, a forma correta de obter o EM é através de um set ou pelo construtor. Isso é chamado inversão de controle e é sempre boa prática tenha ou não o motor de injeção.
ServiceLocator é perigoso e deve apenas ser usado quando nada mais é possivel.