Lazy loading
# Lazy loading

Lazy loading é um padrão de projeto de software, comumente utilizado em linguagens de programação, para adiar a inicialização de um objeto até o ponto em que ele é necessário. Isso pode contribuir para a eficiência no funcionamento de um programa, se utilizado adequadamente. O oposto do carregamento lento (lazy) é o carregamento imediato (eager). Os ganhos de desempenho são especialmente significativos quando inicializar um objeto é custoso, como no caso de acesso a serviços de rede e a listas de objetos de banco de dados (ver JPA e Hibernate). Isso o torna ideal em casos onde o conteúdo é acessado em um servidor de rede, como no caso de sistemas Web.

## Implementações

Existem quatro formas comuns de aplicação do padrão lazy loading: a inicialização lenta; um proxy virtual; um fantasma; e uma interface value holder. Cada uma tem suas vantagens e desvantagens.

### A inicialização lenta

Com a inicialização lenta, o objeto a ser carregado de modo lazy é originalmente definido como nulo, e todos os pedidos para o objeto verificam antes se ele está nulo e o criam "on the fly" antes de retorná-lo, como no seguinte exemplo em C#:
Outro exemplo:
Este método é o mais simples de implementar, embora se o valor nulo é um valor legítimo de retorno, pode ser necessário o uso de um objeto reservado para sinalizar que o objeto principal não foi inicializado.

### Proxy virtual

Proxy Virtual é um objeto com a mesma interface que o objeto real. A primeira vez que um de seus métodos é chamado ele carrega o objeto real, que é, em seguida, delegado.

### Fantasma

Um "fantasma" é um objeto que será carregado em um estado parcial. Ele pode conter apenas o identificador do objeto, mas carrega seus próprios dados na primeira vez que uma de suas propriedades é acessada. Por exemplo, considere que um usuário está prestes a solicitar um conteúdo através de um formulário on-line. No momento da criação, tudo que sabemos é que o conteúdo será acessado, mas qual ação ou conteúdo será utilizado é desconhecido. Exemplo em PHP:

### Interface value holder

É uma interface (genérica) utilizada na manipulação do carregamento lento, fazendo as vezes do objeto:

## Veja também

* JPA - Java Persistence API
* Hibernate
* Padrão de projeto de software
* Proxy
* Avaliação preguiçosa