Использование отложенной инициализации для базы данных в веб-сканере, вероятно, не стоит. Ленивая инициализация добавляет сложность и постоянный удар по скорости. Один случай, когда это оправдано, - когда есть большая вероятность, что данные никогда не понадобятся. Кроме того, в интерактивном приложении его можно использовать для сокращения времени запуска и обеспечения иллюзии скорости.
Для неинтерактивного приложения, такого как веб-сканер, которому, безусловно, понадобится база данных, существует ленивая инициализация.
С другой стороны, веб-сканер легко распараллеливается и значительно выиграет от многопоточности. Использовать его как упражнение для освоения библиотеки java.util.concurrent
было бы крайне полезно. В частности, посмотрите ConcurrentHashMap
и ConcurrentSkipListMap
, , которые позволят нескольким потокам читать и обновлять общую карту.
Когда вы избавляетесь от отложенной инициализации, самый простой шаблон Singleton выглядит примерно так:
class Singleton {
static final Singleton INSTANCE = new Singleton();
private Singleton() { }
...
}
Ключевое слово final
является ключом здесь. Даже если вы предоставляете static
«метод получения» для синглтона вместо прямого доступа к полю, создание синглтона final
помогает обеспечить корректность и позволяет более агрессивную оптимизацию компилятором JIT.