'static' на самом деле не является основной проблемой (хотя это может способствовать).Проблема заключается в методе getNames()
и в том, как результат используется вызывающей стороной.
В вашем классе NamesStore есть один список имен (ArrayList) и одна ссылка на этот список имен (sNames).
Когда вы выполняете return sNames
и вызывающая сторона присваивает возвращаемое значение его переменной names
, у вас все еще остается ровно один список имен (один ArrayList), теперь с двумя ссылками на один и тот же список,Это не следствие «статичности», а следствие того, как Java использует ссылочные типы;короче говоря, присваивание (и возвращение значения) создает копию ссылки, но не создает другого экземпляра объекта, на который ссылаются.
Так, конечно, когда список упоминается как names
модифицируется, что изменяет единственный существующий список имен.
Если вы хотите, чтобы вызывающая сторона могла изменять список, возвращаемый вашим методом getNames()
, без изменения списка, то вынужно вернуть копию вашего списка, а не сам список.
Запись return new ArrayList<>(sNames)
сделает это;но обратите внимание, что копируется только список имен, что бы ни было в списке (предположительно, «имена»), это не так.Другими словами, если ваш абонент изменяет фактическое имя, он изменит единственный экземпляр этого имени.Вам необходимо определить ваши требования.
Альтернативный подход - запретить вашему пользователю изменять возвращаемый список;это может быть реализовано как return Collections.unmodifiableList(sNames)
.Если будет предпринята попытка изменить этот список, код, выполняющий это изменение, потерпит неудачу.Любой, кто хочет изменить список (как в вашем примере), должен сначала сделать себе копию.
Решение между этими двумя, вероятно, принимается на основе рассмотрения того, сколько пользователей getNames()
ожидают изменитьрезультат.Если это не обычный случай, то лучше сделать копирование для этих пользователей.