Разница между `createTypedArrayList ()` и `readTypedList ()` в Parcel - PullRequest
0 голосов
/ 09 сентября 2018

При десериализации посылок я обычно использую метод createTypedArrayList (Creator<T> c) для чтения списков массивов.

Я недавно нашел другой метод readTypedList (List<T> list, Creator<T> c), который, кажется, делает то же самое. Даже документ выглядит идентично. Есть ли какая-то разница между ними, кроме их реализации *?

*: первый создает новый список массивов, где последний добавляет к существующему

1 Ответ

0 голосов
/ 09 октября 2018

И readTypedList(), и createTypedArrayList() были записаны как операция "read" для операции writeTypedList() "write". Поскольку оба они должны работать с одними и теми же данными, различия между ними относительно невелики.

Одно очевидное отличие состоит в том, что readTypedList() будет "заполнять" любую реализацию List, которую вы хотите (например, LinkedList и т. Д.), Тогда как createTypedArrayList() будет только когда-либо возвращать ArrayList.

Другое: readTypedList() позволяет избегать выделения более одного List экземпляра, если вам нужно запустить несколько операций чтения в строке; вы можете передавать один и тот же экземпляр List каждому вызову readTypedList(), а затем обрабатывать его содержимое. readTypedList() будет корректно перезаписывать существующие данные и увеличивать / уменьшать список по мере необходимости, чтобы точно соответствовать всем вновь прочитанным данным. С другой стороны, createTypedArrayList() всегда будет возвращать новый ArrayList экземпляр.

Вероятно, самое большое отличие заключается в том, как они ведут себя, когда вы читаете список null. Если парная операция «запись» была dest.writeTypedList(null), то createTypedArrayList() может вернуть значение null ... но readTypedList() может только очистить существующий переданный список, оставляя вас с пустым, не нулевой список. Это делает практически невозможным определить, был ли ранее написанный список null или просто пуст, и поэтому я всегда использую createTypedArrayList().

Кроме этого, нет никаких отличий. Оба используют Creator.createFromParcel() для фактического извлечения базовых данных, и оба могут обрабатывать null элементов в списке. Опять же, оба метода должны быть в паре с writeTypedList(), поэтому вероятность различий между ними весьма ограничена.

...