гуава: лучшие практики с ImmutableList.of (E []) - PullRequest
9 голосов
/ 21 июля 2011

Я только что заметил, что ImmutableList.of(E[]) устарело в пользу ImmutableList.copyOf(), по очевидной причине, что список не может быть действительно неизменным, если необработанный массив используется в другом месте.

Что если у вас есть метод, который возвращает массив, и вы точно знаете, что метод не держит ссылку на массив, а ваш код не держит ссылку на массив, кроме передачи это к ImmutableList.of()?

Должен ли я ...

  • продолжать использовать ImmutableList.of(E[]) (кажется плохой идеей, поскольку метод исчезнет)
  • использование Collections.unmodifiableList(Arrays.asList())
  • использовать ImmutableList.copyOf() - это, кажется, лучшая идея, когда проблемы с производительностью / ресурсами не возникают, в противном случае копирование не требуется.

1 Ответ

18 голосов
/ 21 июля 2011

ImmutableList.of(E[]) не хранит и не хранит массив, который ему передается напрямую (он не будет неизменным, если это будет сделано, что победит точку класса).Это было объявлено устаревшим по причинам именования.Если вы посмотрите на реализацию, это:

public static <E> ImmutableList<E> of(E[] elements) {
  return copyOf(elements);
}

Так что мой совет - просто использовать ImmutableList.copyOf() в целом.Если вы знаете, что просто оборачиваете массив для внутреннего использования или чего-то подобного, не стесняйтесь сохранять копию и просто использовать Arrays.asList, но я бы предпочел ImmutableList для API.

...