В текущей базе кода, которую я ищу, используется парсер DOM. Следующий фрагмент кода дублируется в 5 методах:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Если метод, содержащий указанный выше код, вызывается в цикле или метод вызывается несколько раз в приложении, мы несли накладные расходы на создание нового экземпляра DocumentBuilderFactory и нового экземпляра DocumentBuilder для каждого вызова такого метода,
Было бы неплохо создать обертку singleton вокруг экземпляров DocumentBuilder factory и DocumentBuilder, как показано ниже:
public final class DOMParser {
private DocumentBuilderFactory = new DocumentBuilderFactory();
private DocumentBuilder builder;
private static DOMParser instance = new DOMParser();
private DOMParser() {
builder = factory.newDocumentBuilder();
}
public Document parse(InputSource xml) {
return builder.parser(xml);
}
}
Существуют ли какие-либо проблемы, которые могут возникнуть, если вышеописанный singleton используется для нескольких потоков? Если нет, будет ли какой-либо прирост производительности за счет использования вышеприведенного подхода для создания экземпляров DocumentBuilderFactory и DocumentBuilder только один раз на протяжении всего срока службы приложения?
Изменить:
Единственный раз, когда мы можем столкнуться с проблемой, - это если DocumentBuilder сохраняет некоторую информацию о состоянии при анализе XML файла, который может повлиять на синтаксический анализ следующего XML файла.