Проблема в том, что это создает неправильное впечатление - это выглядит так, как будто значение не может измениться, тогда как на самом деле только значение поля не может измениться, а не объект. Я думаю, что анализ кода здесь слишком осторожен - во многих местах вы можете захотеть, чтобы изменяемый тип хранился в поле только для чтения, особенно если он закрытый, инициализируется в статическом инициализаторе, а затем никогда не мутирует в вашем коде.
Хотя это поле защищено, существует большая вероятность того, что производные классы будут его использовать. Лично я люблю, чтобы все мои поля были приватными. С другой стороны, я не знаю ваш код - возможно, вы взвесили это в сравнении с возможностями и решили, что это правильно.
Если Foo
действительно потокобезопасен, беспокоиться не о чем, кроме общего впечатления об неизменности, которое дает тот факт, что поле доступно только для чтения. Я бы отключил предупреждение для этой строки и добавил комментарий, чтобы подчеркнуть, что объект изменчив, даже если поле доступно только для чтения.