Відкладена (лінива) ініціалізація (англ. Lazy initialization) — прийом в програмуванні, коли деяка ресурсномістка операція (створення об'єкта, обчислення значення) виконується безпосередньо перед тим, як буде використаний її результат. Таким чином, ініціалізація виконується "на вимогу", а не завчасно. Аналогічна ідея знаходить застосування в самих різних галузях: наприклад, компіляція «на льоту» і логістична концепція «Точно в строк».
Фабрика відкладеної ініціалізації
Шаблон проєктування «відкладена ініціалізація» часто використовують разом з шаблоном фабричного методу. Тут поєднані три ідеї:
- використання фабричного методу для отримання екземпляра класу
- збереження екземплярів у відображенні (Map), так що наступного разу можна запросити цей же екземпляр (Мультитон, Unit Of Work, тощо)
- використання відкладеної ініціалізації для створення екземпляра об'єкта лише тоді, коли поступає запит
Приклади
C#
using System; namespace LazyInitialization { // важкий об'єкт class Biggy { public Biggy() { Console.WriteLine("Biggy is created"); } } // реалізуємо ліниву ініціалізацію вручну class A { Biggy biggy; public A() { biggy = null; Console.WriteLine("A is created"); } public Biggy GetBiggy { get { if (biggy == null) biggy = new Biggy(); return biggy; } } } // використаємо вбудований механізм class B { Lazy<Biggy> biggy; public B() { biggy = new Lazy<Biggy>(); Console.WriteLine("B is created"); } public Biggy GetBiggy => biggy.Value; } class Program { static void Main(string[] args) { // створюємо важкий об'єкт // лише при необхідності (непарні індекси) // і всі наступні запити використовують цей самий об'єкт A a = new A(); for (int i = 0; i < 5; ++i) { if (i % 2 != 0) { Console.WriteLine("= Need biggy ="); Biggy biggy = a.GetBiggy; } else { Console.WriteLine("= No biggy needed ="); } } Console.ReadLine(); } } }
Java
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); } }
JavaScript
var Fruit = (function () { var types = {}; function Fruit() {}; // counts own properties in object function count(obj) { var i = 0; for (var key in obj) { if (obj.hasOwnProperty(key)) { i++; } } return i; } var _static = { getFruit: function (type) { if (types[type] === undefined) { types[type] = new Fruit; } return types[type]; }, printCurrentTypes: function () { console.log('Number of instances made: ' + count(types)); for (var type in types) { console.log(type); } } }; return _static; })(); Fruit.getFruit('Apple'); Fruit.printCurrentTypes(); Fruit.getFruit('Banana'); Fruit.printCurrentTypes(); Fruit.getFruit('Apple'); Fruit.printCurrentTypes();
Посилання
- Article «Java Tip 67: Lazy instantiation [ 7 червня 2011 у Wayback Machine.] — Balancing performance and resource usage» by and
- Java code examples [ 18 листопада 2008 у Wayback Machine.]
- Use Lazy Initialization to Conserve Resources [ 2 грудня 2019 у Wayback Machine.]
- Description from the Portland Pattern Repository [ 26 вересня 2011 у Wayback Machine.]
- Lazy Inheritance in JavaScript [ 13 січня 2010 у Wayback Machine.]
- Lazy Inheritance in C# [ 29 квітня 2011 у Wayback Machine.]
Ця стаття потребує додаткових для поліпшення її . (березень 2017) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Vidkladena liniva inicializaciya angl Lazy initialization prijom v programuvanni koli deyaka resursnomistka operaciya stvorennya ob yekta obchislennya znachennya vikonuyetsya bezposeredno pered tim yak bude vikoristanij yiyi rezultat Takim chinom inicializaciya vikonuyetsya na vimogu a ne zavchasno Analogichna ideya znahodit zastosuvannya v samih riznih galuzyah napriklad kompilyaciya na lotu i logistichna koncepciya Tochno v strok Fabrika vidkladenoyi inicializaciyiShablon proyektuvannya vidkladena inicializaciya chasto vikoristovuyut razom z shablonom fabrichnogo metodu Tut poyednani tri ideyi vikoristannya fabrichnogo metodu dlya otrimannya ekzemplyara klasu zberezhennya ekzemplyariv u vidobrazhenni Map tak sho nastupnogo razu mozhna zaprositi cej zhe ekzemplyar Multiton Unit Of Work tosho vikoristannya vidkladenoyi inicializaciyi dlya stvorennya ekzemplyara ob yekta lishe todi koli postupaye zapitPrikladiC Priklad realizaciyi movoyu C using System namespace LazyInitialization vazhkij ob yekt class Biggy public Biggy Console WriteLine Biggy is created realizuyemo linivu inicializaciyu vruchnu class A Biggy biggy public A biggy null Console WriteLine A is created public Biggy GetBiggy get if biggy null biggy new Biggy return biggy vikoristayemo vbudovanij mehanizm class B Lazy lt Biggy gt biggy public B biggy new Lazy lt Biggy gt Console WriteLine B is created public Biggy GetBiggy gt biggy Value class Program static void Main string args stvoryuyemo vazhkij ob yekt lishe pri neobhidnosti neparni indeksi i vsi nastupni zapiti vikoristovuyut cej samij ob yekt A a new A for int i 0 i lt 5 i if i 2 0 Console WriteLine Need biggy Biggy biggy a GetBiggy else Console WriteLine No biggy needed Console ReadLine Java Priklad realizaciyi movoyu Java public class Fruit private static final Map lt String Fruit gt types new HashMap lt String Fruit gt 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 JavaScript Priklad realizaciyi movoyu JavaScript var Fruit function var types function Fruit counts own properties in object function count obj var i 0 for var key in obj if obj hasOwnProperty key i return i var static getFruit function type if types type undefined types type new Fruit return types type printCurrentTypes function console log Number of instances made count types for var type in types console log type return static Fruit getFruit Apple Fruit printCurrentTypes Fruit getFruit Banana Fruit printCurrentTypes Fruit getFruit Apple Fruit printCurrentTypes PosilannyaArticle Java Tip 67 Lazy instantiation 7 chervnya 2011 u Wayback Machine Balancing performance and resource usage by and Java code examples 18 listopada 2008 u Wayback Machine Use Lazy Initialization to Conserve Resources 2 grudnya 2019 u Wayback Machine Description from the Portland Pattern Repository 26 veresnya 2011 u Wayback Machine Lazy Inheritance in JavaScript 13 sichnya 2010 u Wayback Machine Lazy Inheritance in C 29 kvitnya 2011 u Wayback Machine Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2017 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi