У этого класса есть нетривиальная работа по инициализации. В комментарии к другому ответу вы упомянули, что сбой подключения к базе данных не должен привести к краху всего этого. В этом классе вам также потребуется некоторая надежность и отказоустойчивость.
Поскольку каждый метод может вызвать исключение, если объект не инициализирован, вызывающие объекты всегда должны проверять объект перед вызовом метода. И когда они вызывают init()? Могут ли они назвать это более одного раза?
У Лайва определенно есть хорошее предложение скрыть эту логику инициализации. Это требует другого дизайна для других методов. Они должны работать, даже если база данных и фоновый поток не были инициализированы. В основном вам нужна очередь в памяти, когда другие методы вызываются до полной инициализации объекта.
private void init():
connect to database
verify existence of a table
start a thread
initialized = true
for params in doSomethingParams
// replay method calls invoked before this object was initialized
doSomething(params)
public String doSomething(Some Input):
if !initialized
init();
doSomethingParams.add(Some Input);
else
someJobQueue.add(Some Input);
return "what you would have normally returned";
После инициализации пройдитесь по всем «локальным» очередям, чтобы поместить вещи во вновь инициализированную очередь заданий. Дело в том, что убедитесь, что этот метод работает успешно, даже если фоновый поток или база данных недоступны, путем помещения параметров в список. Когда эти другие ресурсы доступны, выполните цикл по этому локальному списку и снова вызовите doSomething
, передав параметры в списке, который по существу «повторяет» прошлые вызовы метода.
Основная проблема здесь заключается в том, что любой вызов вашей службы может инициировать асинхронную операцию, но если вы помещаете что-то в очередь, которую использует другой поток, она уже является асинхронной. Звонящие должны исходить из этого факта.
Вы можете сохранить метод init(), но он будет приватным, и его будут вызывать только методы класса службы. Это дает вам ленивую инициализацию, устраняет некоторые ненужные исключения и дает вам надежность, которую вы ищете.