Рекомендуется ли кэшировать результат Collections.unmodifiableList () в поле? - PullRequest
0 голосов
/ 14 сентября 2018

Какой рекомендуемый подход:

private final List<Object> list = new ArrayList<>();

public List<Object> getListView() {
    return Collections.unmodifiableList(list);
}

или

private final List<Object> list = new ArrayList<>();
private final List<Object> listView = Collections.unmodifiableList(list);

public List<Object> getListView() {
    return listView;
}

Последний экономит на создании объекта, но стоит ли усилий?

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

Большую часть времени разница вряд ли измерима, поэтому я бы оставил это простым.Однако существуют случаи, когда может быть существенная разница:

 Collections.unmodifiableList(list).equals(Collections.unmodifiableList(list))

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

Несмотря на это, я бы посоветовал сохранить его простым и оптимизировать только тогда, когда приложение нуждается в нем и профилировщик показываетчто это может помочь.

Подумайте об использовании ImmutableList в Guava, если можете.

0 голосов
/ 14 сентября 2018

Подход 1 рекомендуется в качестве сценария с отложенной загрузкой и может сэкономить вам несколько ресурсов.Также создание unmodifiableList не является дорогой операцией.

0 голосов
/ 14 сентября 2018

Второй подход определенно экономит ваши ассигнования и освобождения.Однако частота таких распределений не будет критической, чтобы оправдать хранение listView объекта.Рассмотрим типичное использование:

for (Object obj : getListView()) {
    ... // Do something with each object
}

За одним вызовом getListView() следует N итераций его содержимого, что делает долю времени, затрачиваемую на создание неизменяемого представления, слишком маленькой, чтобы оправдать усилия.

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

0 голосов
/ 14 сентября 2018

Создание unmodifiableList - это операция O (1) (по сути, она создает экземпляр java.util.Collections$UnmodifiableList и присваивает ваш список датамамберу).

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

...