Lazy initialization

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Odložená inicializace (anglicky Lazy Initialization) je jeden z návrhových vzoru využívaných v programování. Jíž z názvu lze postřehnout, že se jedná o odložení vytváření objektu, počítání hodnoty nebo provádění nějakého procesu, až do chvíle, kdy ho budeme poprvé potřebovat.

Účel

V programování se často setkáváme se situacemi, kdy na jedné straně pracujeme s několika velkými objekty a na druhé potřebujeme program zoptimalizovat. Je sice možnost ty objekty inicializovat již od začátku, ale co když ho budeme potřebovat jenom jednou a někdy ke konci programu. +more Nebo svými podmínkami ten objekt celý program přeskočí a nevyužije vůbec. Tudíž vytváření takového objektu hned od začátku je nevhodné a východiskem z této situaci je tak zvaná odložená inicializace.

Odložená inicializace je pak často využívá s jinými návrhovými vzory, jako jsou Tovární metoda (Factory Method), Jedináček (Singleton) nebo Proxy.

Plusy

Inicializace objektu probíhá ve chvíli kdy je opravdu nutná * Zrychluje se počáteční inicializace

Minusy

Není možné vytvořit pořadí inicializovaných objektů * Vzniká odezva při dotazování se na objekt

Základní implementace

Nejobyčejnější Java kód bez odložené inicializace by mohl vypadat asi takto:

// Normální statická inicializace (nikoli odložená) private static final Foo foo = new Foo;

public static Foo getFoo { return foo; }

Objekt je vytvářen hned od začátku. Metoda getFoo je rychlá ale nesynchronizovaná. +more Pro jednoduché aplikace to bohatě stačí. Kdybychom ale přece potřebovali pracovat s odloženou inicializací, museli bychom brat ohled i na aplikaci pracující s vlákny.

// Řádně synchronizovaná odložená inicializace private static Foo foo = null;

public static synchronized Foo getFoo { if (foo == null) foo = new Foo; return foo; }

Ve výše uvedené podobě je už vidět, že se objekt nevytvářel hned od začátku, ale počká se na zavolání synchronizované metody getFoo, která vrací objekt, pokud existuje, anebo pokud se jedná o první volání, ho vytvoří. Takový způsob ale zahrnuje i náklady na synchronizaci (když v poslední době poměrně malé). +more Kdybychom to chtěli optimalizovat i v tomto směru, můžeme využít i jiný způsob.

// Idiom držitelské třídy inicializace podle potřeby private static class FooHolder { static final Foo foo = new Foo; }

public static Foo getFoo { return FooHolder.foo; }

Když je metoda getFoo volána poprvé, přečte atribut FooHolder. foo, čímž způsobí inicializaci třídy FooHolder. +more Takže se zase jedná o odloženou inicializaci, ale zároveň vynecháváme potřebu synchronizovat, protože volání metody zajišťuje pouze přístup k atributu. Nevýhodou takového triku ale je, že pracuje pouze se statickými atributy.

Příklad využití

Jedna z možných situací, kdy je možné používat odloženou inicializaci je práce s poli. Aby bylo vhodné využívat takový vzor, měla by práce s polem splňovat alespoň tyto podmínky

* Vytváření pole by bylo velmi náročné * Pole má volitelný charakter, jinými slovy může, ale nemusí se s ním pracovat.

Představme si, že máme košík, do kterého budeme vkládat různá ovoce. Zároveň ale nevíme, kolik jich tam bude, ani jakého budou druhu.

Jak je vidět, vytváření takového pole je poměrně náročné. Na druhou stranu pomoci Odložené inicializaci se problém zjednodušuje.

import java.util.*;

public class Ovoce { private static final Map typy = new HashMap; private final String typ;

// Používá se privátní konstruktor, aby zamezil vytváření z venčí private Ovoce(String typ) { this.typ = typ; }

/** * Odložená inicializace vrací instanci třídy Ovoce na základě jejího * typu. Inicializuje nový, pokud je to nutno. +more * @param type jakýkoliv String, určující typ ovoce (např. "jablko") * @return instanci Ovoce na základě druhu ovoce. */ public static synchronized Ovoce getOvoce(String typ) { if(. typy. containsKey(typ)) { typy. put(typ, new Ovoce(typ)); // Zde je Odložená inicializace } return typy. get(typ); } }.

Externí odkazy

[url=http://www.javapractices.com/topic/TopicAction.do?Id=34]Lazy initialization[/url]

Kategorie:Návrhové vzory

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top