package ru.csu.stan.java.classgen.util; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; /** * Фабрика генерации идентификаторов для классов. * * @author mz * */ public class ClassIdGenerator implements IClassIdGenerator { /** Единственный экхемпляр, для обеспечения уникальности */ private static final IClassIdGenerator instance = new ClassIdGenerator(); /** Словарь полных имен классов и ID, поставленных им в соответствие */ private Map<String, BigInteger> ids = new HashMap<String, BigInteger>(); /** Следующий доступный ID класса */ private int id = 1; /** * Закрытый конструктор. * @see #getInstance() */ protected ClassIdGenerator() {} /** * Получение экземпляра фабрики. * Гарантировано, что экземпляр будет всегда одинаковый. * @return */ public static IClassIdGenerator getInstance(){ return instance; } @Override public BigInteger getClassId(String className){ if (!isClassWithId(className)) setClassId(className, getNextId()); return getClassIdNotSafe(className); } /** * @return */ protected BigInteger getNextId() { return BigInteger.valueOf(id++); } /** * @param className * @return */ protected BigInteger getClassIdNotSafe(String className) { return ids.get(className); } /** * @param className * @param id */ protected void setClassId(String className, BigInteger id) { ids.put(className, id); } /** * @param className * @return */ protected boolean isClassWithId(String className) { return ids.containsKey(className); } }