четверг, 18 августа 2011 г.

Ленивая инициализация. Пример кода


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public final class Person {
    private final int id;
    private final String name;
    private final Map knownPersons = new HashMap();
    
    public Person(int id, String name) {
        this.name = name;
        this.id = id;
    }
    
    /**
     * Метод возвращает объект персоны, с которой знакома данная персона
     * Если персоны еще не знакомы, то текущая персона знакомится и запоминает
     * В этом методе и есть весь смысл примера
     */
    public Person getKnownPerson(int id) {
        if (!knownPersons.containsKey(id)) {
            knownPersons.put(id, new Person(id, getNameById(id)));
        }
        return knownPersons.get(id);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        if (knownPersons.size() > 0) {
            Iterator iterator = knownPersons.keySet().iterator();
            while (iterator.hasNext()) {
                int key = iterator.next();
                Person person = knownPersons.get(key);
                sb.append(person.toString());
            }
        } else {
            sb.append("no known persons");
        }
        return "Person [id=" + id + ", name=" + name + ", knownPersons="
                + sb + "]";
    }

    private String getNameById(int id) {
        return id + "'s Name";
    }
    
    public static void main(String[] args) {
        Person person1 = new Person(1, "Вася Петя");
        Person person2 = person1.getKnownPerson(2);
        Person person3 = person1.getKnownPerson(3);
        System.out.println(person2.toString());
        System.out.println(person3.toString());
        System.out.println(person1.toString());
    }
}
/**
 * Output:
 * Person [id=2, name=2's Name, knownPersons=no known persons]
 * Person [id=3, name=3's Name, knownPersons=no known persons]
 * Person [id=1, name=Вася Петя, knownPersons=
 *     Person [id=2,name=2's Name, knownPersons=no known persons]
 *     Person [id=3, name=3's Name, knownPersons=no known persons]
 * ]
 */

1 комментарий: