2013-09-13 3 views
1

Позвольте мне объяснить, я читал (невероятно) о том, что ваши коллекции не поддаются изменению, посмотрите encapsulate collections, это интересная идея, но я не могу представить для нее практическую ситуацию.Полезен ли этот метод Collections.unmodifiableList?

Может ли кто-нибудь объяснить его практическое применение?

+0

@Dukeling ти для улучшения ми текста. – ZaoTaoBao

ответ

2

Он имеет два основных преимущества:

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

Последнее часто бывает полезно, если вы хотите для предотвращения использования пользователями класса одиозы собственной собственной коллекции.

В настоящее время считается хорошим дизайном в пользу composition over inheritance, который идеально подходит для этого рисунка.

Пример 1:

class myComplicatedCollection<T> implements Collection<T> { 
    // Code goes here 

    // O no, I still have to deal with the read-only use-case. 
    // Instead of duplicating almost all of my code or using inheritance I'll use this handy-dandy wrapper 
    public Collection<T> readonlyVersion() { 
      return Collections.unmodifiableCollection(this); 
    } 
} 

Пример 2:

class myClass { 
    private Collection<T> theData; 

    // Users need to access the data, 
    // but we don't want them modifying the private data of this class 
    public Collection<T> getTheData() { 
     return Collections.unmodifiableCollection(theData); 
    } 
} 
3

Это очень полезно, когда вы возвращаетесь список, что это частный член объекта, как изменение списка из-за пределов сломается инкапсуляция

eg obj.getList().clear(); очистит список внутри obj (asssuming getList() возвращает частный член), но если getList() вернул список, который был передан в Collections.unmodifiableList, тогда будет исключено исключение

2

Используйте его в любое время для безопасного опубликования списка и/или обеспечения неизменности.

Например:

// neither the reference nor the contents can change 
private static final List<String> codes = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); 

Этот список не может быть изменен внутри класса, и могут быть опубликованы благополучно:

// the caller can't change the list returned 
public static List<String> getCodes() { 
    return codes; 
} 
Смежные вопросы