desculpe cara, eu não entendi a sua dúvida, o que você está fazendo é criar o objeto apenas quando ele não existe
inicialização tardia - no meu ponto de vista - é você criar o objeto apenas no momento anterior ao que ele for necessário
um suposto caso de inicialização tardia é o famoso lazy initialization do hibernate… ( neste caso o tabela só será mapeada pelo objeto quando seu uso for necessário )
um exemplo de código pode ser visto na wikipedia
import java.util.*;
public class Fruit
{
private static final Map<String,Fruit> types = new HashMap<String,Fruit>();
private final String type;
// using a private constructor to force use of the factory method.
private Fruit(String type) {
this.type = type;
}
/**
* Lazy Factory method, gets the Fruit instance associated with a
* certain type. Instantiates new ones as needed.
* @param type Any string that describes a fruit type, e.g. "apple"
* @return The Fruit instance associated with that type.
*/
public static synchronized Fruit getFruit(String type) {
if(!types.containsKey(type))
types.put(type, new Fruit(type)); // Lazy initialization
return types.get(type);
}
}
Minha questão é no seguinte contexto: Usar injeção de dependência é melhor?
Além desse recurso (ID), que outros temos nesse sentigo?
Tem dado muito trabalho e não parece muito eficiente, principalmente para atualizações.
Ouvi alguem dizer que existem outras alternativas. Alguém sabe do que se trata?!?!?!
Injeção de dependências não precisa, necessariamente, de um contêiner. Você pode usar até o construtor do objeto para passar a dependência para ele. Ou seja, no seu caso, você não teria o f == null, mas sim, retornaria direto. Só teria que ter o cuidado de sempre passar uma dependência válida pelo construtor.