Это кажется приемлемым вариантом. У меня есть одно предложенное изменение для вашего образца, и оно должно вызывать getApiUrl()
в инициализаторе второй статики, делая его единственным инициализатором ... таким образом:
static const QString endpointUrl = QString("%1/%2").arg(getApiUrl(), "endpoint");
Это на один объект меньше, чем на всю жизнь вашей программы.
При кэшировании со статикой возникает ряд проблем:
- Вы теряете контроль над временем жизни этого объекта. Это может или не может быть проблемой в зависимости от того, нуждается ли этот объект в указателе / ссылке на что-то другое, чтобы правильно очистить после себя.
- Я не верю, что есть какие-либо гарантии в отношении порядка деконструкции статических объектов ... Может быть необходимо дополнительно обернуть вещи в
shared_ptr
, чтобы гарантировать, что ресурсы не будут извлечены из-под ваших статических объектов.
- Кэши, как правило, часто обеспечивают способ очистки их сохраненных значений и их повторного заполнения. Для статики такого механизма не существует, в частности
const static
s.
РЕДАКТИРОВАТЬ: Ходят слухи, что безопасность потока не является проблемой.
Но если ни одна из этих проблем не применима в вашем конкретном случае использования, тогда непременно используйте static
.
РЕДАКТИРОВАТЬ: Нетривиальный комментарий комментарий:
Я не могу дать достаточно сильный совет в зависимости от порядка уничтожения статического объекта.
Визуализация, изменяющая вашу программу так, что ваша система загрузки ресурсов теперь запускается перед вашей системой регистрации. Вы устанавливаете точку останова и шагаете по новому коду, после чего вы видите, что все в порядке. Вы заканчиваете сеанс отладки, запускаете свои модульные тесты, и они все проходят. Проверьте в источнике, и ночные интеграционные тесты не пройдут ... , если вам повезет . Если это не так, ваша программа начинает аварийно завершать работу при выходе перед клиентами.
Оказывается, ваша система ресурсов пытается что-то записать при выключении. Boom. Но эй ... все по-прежнему работает нормально! Зачем исправлять это, верно?
О, и получается, что то, что ваша система ресурсов пыталась зарегистрировать, было ошибкой, которая будет проблемой только для вашего крупнейшего клиента.
Уч.
Не будь тем парнем. Не зависит от статического порядка деструктора.
(Хорошо, теперь представьте, что порядок создания / разрушения объектов не является детерминированным, потому что некоторые из этих функций со статическими объектами вызываются из разных потоков. С кошмарами еще нет?)