Лінива ініціалізація

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Відкладена (лінива) ініціалізація (англ. Lazy initialization) - прийом в програмуванні, коли деяка ресурсномістка операція (створення об'єкта, обчислення значення) виконується безпосередньо перед тим, як буде використаний її результат. Таким чином, ініціалізація виконується «на вимогу », а не завчасно. Аналогічна ідея знаходить застосування в самих різних галузях: наприклад, компіляція «на льоту» і логістична концепція «Точно в строк».

"Lazy factory"[ред.ред. код]

В патернах програмування lazy initialization часто використовується разом з патерном фабричного методу. Тут комбінуються три ідеї:

  • використання фабричного методу для отримання екземпляра класу
  • збереження екземплярів у мапі, так що наступного разу можна запросити це же екземляр (Multiton pattern подібний to the singleton pattern)
  • використання lazy initialization для створення екземпляра об'єкта якраз тоді коли поступає запит

Приклади[ред.ред. код]

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();

Посилання[ред.ред. код]