Diferença Prática / Conceitos setar novo atributo ou utilizar método public static

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.