Имя для определенного необработанного типа / неконтролируемого приведенного списка при использовании обобщений Java - PullRequest
3 голосов
/ 19 октября 2010

Effective Java 2nd Edition говорит, что мы не должны использовать необработанные типы в новом коде, и мы должны также попытаться исключить все предупреждения о непроверенных приведениях, а также доказать и задокументировать его безопасность, если мы решим подавить такиепредупреждение.

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

  • A static final поле, которое объявлено с необработанным типом и ссылается на неизменный объект
  • A static универсальный метод, которыйвозвращает параметризованную версию этого поля, используя непроверенное приведение

Наиболее известный пример этого «шаблона» находится в java.util.Collections:

Вопросы:

  • Как называется эта идиома?
  • В каких авторитетных источниках эта идиома обсуждалась ранее?

См. Также

  • Effective Java 2nd Edition
    • Пункт 23: Не используйте необработанные типы в новом коде
    • Пункт 24: Устраните непроверенные предупреждения

1 Ответ

1 голос
/ 19 октября 2010

В ваших трех примерах на самом деле происходит оптимизация памяти, потому что с пустым Collection вы используете подмножество поведения класса, не полагаясь на то, что зависит от параметризованного типа, вы можете повторно использовать raw экземпляр.

Вы можете написать emptyList() следующим образом

private static <T> List<T> emptyList() {
    return new EmptyList<T>();
}

Единственная разница в поведении: Collections.emptyList() == Collections.emptyList() вернет false.

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

...