Для чего нужен вызов Collections.checkedList () в Java? - PullRequest
12 голосов
/ 21 июля 2009

Я просто хочу знать, для чего на самом деле используется java.util.Collections.checkedList().

У меня есть код, который, как я знаю, возвращает мне List<String>, но он проходит через цепочку сообщений и возвращается мне как java.io.Serializable. Хорошо ли, что вызов checkList превращает мой Serializable в List<String>? Я знаю, что могу привести его к java.util.List, но я бы предпочел не проверять каждый элемент, и мне неудобно считать, что каждый элемент является String.

Ответы [ 3 ]

16 голосов
/ 21 июля 2009

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

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

Как вы могли бы использовать его в вашем случае:

 Collections.checkedList(
      new ArrayList<String>(uncertainList.size()), String.class)
      .addAll(uncertainList);

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

15 голосов
/ 21 июля 2009

Не совсем:

Collections.checkedList только украсит список, чтобы предотвратить будущие вставки с объектами неправильного класса, он не проверит все элементы, которые уже есть в списке.

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

9 голосов
/ 21 июля 2009

Обсуждение того, для чего может использоваться checkedList, доступно в документации для checkedCollection . Причины приведены:

  • в качестве средства отладки (если кто-то использовал непроверенный состав)
  • для обеспечения безопасности при передаче коллекции для заполнения сторонним кодом.

Вы можете использовать следующее из google collection , чтобы проверить, что список содержит только строки:

Iterables.all(list, Predicates.instanceOf(String.class))
...