Что касается правильности, переключив YEAR_INFO_CACHE на статический, вы ввели небольшую утечку памяти. Есть несколько способов определить, имеют ли значение ваши статические ссылки на практике, например, сделайте приблизительную аппроксимацию того, насколько большой кэш будет расти на основе того, что вы знаете о данных; профилировать кучу во время / после нагрузочного теста вашего приложения; и т.д.
Вы кэшируете такие маленькие объекты, что, вероятно, многие из них могут быть кэшированы без проблем Тем не менее, если вы обнаружите, что кеш должен быть ограничен, у вас есть несколько вариантов, таких как кеш LRU, кеш, основанный на мягких ссылках, а не на прямых (сильных) ссылках и т. Д. Но еще раз подчеркну, что для вашего В конкретной ситуации реализация любого из этих может быть пустой тратой времени .
Чтобы объяснить теоретическую проблему со статическими ссылками, я буду ссылаться на другие сообщения, а не воспроизводить их здесь:
1. Открыты ли статические поля для сборки мусора?
2. Может ли использование слишком большого количества статических переменных вызвать утечку памяти в Java?
Также в отношении корректности код является поточно-ориентированным не потому, что ссылки являются окончательными, а потому, что значения YearInfo, созданные несколькими потоками для некоторой позиции в кэше, должны быть равными, поэтому не имеет значения, какой из них окажется в кэше.
Что касается дизайна, все связанные с YearInfo материалы в исходном коде Joda являются частными, поэтому детали YearInfo, включая кеширование, хорошо инкапсулированы. Это хорошая вещь.
Что касается производительности, лучшее, что нужно сделать, - это профилировать свой код и посмотреть, что использует значительное количество ЦП. Для профилирования вы хотите увидеть, имеет ли значение время, проведенное в этом коде, в контексте всего вашего приложения. Запустите приложение под нагрузкой и проверьте, имеет ли значение эта конкретная часть кода. Если вы не видите проблем с производительностью в этом коде даже без кеша YearInfo, то, вероятно, не стоит тратить время на работу с этим кешем. Вот некоторая информация о том, как сделать проверку:
1. Профилировщик производительности для Java-приложения
2. Как найти ресурсоемкий класс в Java?
Тем не менее, обратное утверждение верно - если то, что у вас есть, работает, то оставьте все как есть!