CodeQuality / Guava: очистить и заполнить окончательный список или назначить новый список неизменных - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть класс, содержащий записи в списке, которые время от времени могут очищаться и пополняться методом. Считается ли лучшей практикой использование обычного List в качестве последнего члена класса, или я должен создавать Immutablelist каждый раз, когда он пополняется, поэтому теряется модификатор 'final'?

Причина, по которой я спрашиваю, заключается в том, что другие объекты могут получать доступ к списку извне, но не должны иметь возможность их изменять. Я хочу вернуть им ImmutableList, но не копировать его каждый раз, когда вызывается метод доступа.

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Я бы на самом деле не использовал Guava для этого варианта использования, а просто инструменты в JDK.

Что вам нужно сделать, это использовать традиционную реализацию изменяемого списка - возможно, ArrayList - в вашемучебный класс.Тем не менее, ваш класс должен реализовывать метод getList () как что-то вроде

public List<Something> getList() {
  return Collections.unmodifiableList(internalList);
}

Это гарантирует, что другие объекты не смогут изменять список, но список можно изменить, как вам нравится.

2 голосов
/ 18 ноября 2011

В зависимости от того, как часто список изменяется / насколько велик список, я могу использовать не окончательное поле ImmutableList. Ваш внутренний метод будет создавать новый ImmutableList каждый раз, когда список изменяется.

Если список часто изменяется или если он очень большой (поэтому слишком дорогостоящий, чтобы каждый раз создавать новый список), я бы использовал изменяемый список с оболочкой Collections.unmodifiableList(), как предложил Луи.

Обратите внимание, что вы также можете рассмотреть CopyOnWriteArrayList , если важен одновременный доступ (или используйте изменчивый ImmutableList и какую-то блокировку ...).

1 голос
/ 17 ноября 2011
Модификатор

final в Java не защищает сам список от изменения. Это просто говорит о том, что ссылка никогда не будет указывать на другой объект, но указанный объект может измениться.

Неизменяемый список - это нечто иное. Сам неизменный список не может изменить его содержимое, но вы можете указать ссылку на такой список на другой, если он не является окончательным.

Так что может иметь смысл иметь окончательный неизменный список. Я бы всегда использовал неизменяемый список, когда вам не нужен изменяемый список.

Как сказал один из главных разработчиков guava: «Вам не следует спрашивать, нужен ли вам неизменный список. Вам лучше спросить, нужен ли он для изменчивости». Не знаю точных слов ... он сказал это в канале разработчиков Google на YouTube.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...