Разница между устаревшим и устаревшим API?

Я изучал устаревший API в Java Collection Framework и я узнал, что classы, такие как Vector и HashTable , были заменены ArrayList и HashMap .

Однако все же они НЕ устарели и считаются наследием, когда по существу, устаревание применяется к функциям программного обеспечения, которые заменяются и их следует избегать, поэтому я не уверен, когда API считается устаревшим и когда он устарел.

Из официального глоссария Sun:

debrecation : Относится к classу, интерфейсу, конструктору, методу или полю, который больше не рекомендуется, и может перестать существовать в будущей версии.

Из того, как и когда следует отказаться от руководства:

Возможно, вы слышали термин «самоуничижительный юмор» или юмор, который минимизирует важность оратора. Устаревший class или метод подобны этому. Это уже не важно. На самом деле это неважно, что вы больше не должны его использовать, поскольку оно было заменено и может перестать существовать в будущем.

@Deprecated аннотация @Deprecated один шаг и предупредила об опасности:

Программный элемент, аннотированный @Deprecated является тем, что программистам не рекомендуется использовать, как правило, потому, что это опасно , или потому, что существует лучшая альтернатива.

Рекомендации

  • java.sun.com Глоссарий
  • Языковой справочник / Как и когда отказаться от API
  • Тип annotations Устаревший API

Обратите внимание, что официальный глоссарий не определяет, что означает «наследие». По всей вероятности, это может быть термин, который использовал Джош Блох без точного определения. Тем не менее, подразумевается, что class устаревших classов никогда не должен использоваться в новом коде, и существует хорошая замена.

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

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


Цитаты из Effective Java 2nd Edition

Для сравнения того, как эти термины используются в контексте, это цитаты из книги, в которой появляется слово «устаревшее» :

Пункт 7: Избегайте финализаторов . Единственными методами, которые утверждают, что они гарантируют завершение, являются System.runFinalizersOnExit и его злые двойные Runtime.runFinalizersOnExit . Эти методы являются смертельно ошибочными и устарели.

Пункт 66: Синхронизация доступа к совместно используемым изменяемым данным : библиотеки предоставляют метод Thread.stop , но этот метод устарел давно, потому что он по своей сути небезопасен – его использование может привести к повреждению данных.

Пункт 70: Безопасность streamа документов : метод System.runFinalizersOnExit является поточно-враждебным и устарел.

Пункт 73: Избегайте групп streamов : они позволяют применять некоторые примитивы Thread к кучке streamов одновременно. Некоторые из этих примитивов устарели, а остальные редко используются. […] группы streamов устарели.

Напротив, это кавычки, где появляется слово «наследие» :

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

Пункт 25: Предпочтительные списки для массивов : Erasure – это то, что позволяет универсальным типам свободно взаимодействовать с устаревшим кодом, который не использует дженерики.

Пункт 29: Рассмотрите типы гетерогенных контейнеров : эти обертки полезны для отслеживания того, кто добавляет неверно типизированный элемент в коллекцию в приложении, которое смешивает общий и устаревший код.

Пункт 54: разумно использовать собственные методы : они предоставляют доступ к библиотекам устаревшего кода, которые, в свою очередь, могут обеспечить доступ к устаревшим данным. […] Также законно использовать собственные методы для доступа к устаревшему коду. […] Если вы должны использовать собственные методы для доступа к низкоуровневым ресурсам или устаревшим библиотекам, используйте как можно меньше собственного кода и тщательно протестируйте его.

Пункт 69: Предпочитайте утилиты параллелизма, чтобы ждать и уведомлять : в то время как вы всегда должны использовать утилиты параллелизма, предпочитая wait и notify , вам может потребоваться сохранить устаревший код, который использует wait и notify .

Эти цитаты не были тщательно отобраны: это ВСЕ экземпляры, где в книге появляются слова «устаревшие» и «устаревшие» . Сообщение Блоха ясно здесь:

  • Устаревшие методы, например Thread.stop , являются опасными и никогда не должны использоваться вообще.
  • С другой стороны, например, wait/notify может оставаться в устаревшем коде, но не должен использоваться в новом коде.

Мое собственное субъективное мнение

Моя интерпретация заключается в том, что обескураживание чего-то признает, что это ошибка, и с самого начала не было хорошего. С другой стороны, classификация того, что что-то является наследием, допускает, что в прошлом оно было достаточно хорошим, но оно служило своей цели и уже недостаточно хорошо для настоящего и будущего.

Общим толкованием является то, что Устаревшее означает, что оно будет удалено в ближайшем будущем, а Legacy означает, что оно останется для обратной совместимости или по другим причинам.

Оба означают, что они не должны использоваться новым кодом.

В случае JDK даже устаревший код останется, так как обратная совместимость очень важна для Java JDK.

Устаревание часто означает, что есть намерение удалить функциональность в какой-то момент в будущем, в то время как наследие просто подразумевает, что он не должен использоваться в новом коде, если это вообще возможно (хотя может потребоваться даже тогда для причин вмешательства).

Устаревшая аннотация дает формальное определение устаревшего API. Я не думаю, что существует формальное определение для устаревших classов. Оба фактически означают, что class не должен использоваться в новом коде.

У меня есть предложение – наследие относится к коду, который был написан в прошлом, устаревший относится к совету не использовать его больше. Вы все равно можете использовать устаревший api, но вы не можете писать устаревший код, потому что вы пишете его прямо сейчас. Просто ИМХО

Устаревание означает, что это плохо и не должно использоваться. File.toURL() является ярким примером, поскольку он не создает правильные URL-адреса из файлов с пробелами в пути. Это просто не делает то, что нужно, но поскольку существующий код может использовать обходные пути, которые бы ломались, если ошибка была исправлена

Наследие просто означает, что оно устарело, и есть способы сделать что-то, что обычно, но не обязательно, лучше. Vector – хороший пример – это реализация List , но у него все еще есть уродливое дерьмо за несколько дней до того, как был разработан API коллекций (т. Е. List ). Он также синхронизируется, что означает, что вы должны платить плату за синхронизацию даже при использовании ее в однопоточном сценарии (за исключением случаев, когда виртуальная машина умна). ArrayList лучше, если вам нужна реализация списка с поддержкой массива, так как она несинхронизирована, а Collections.synchronizedList более гибкая, если вам нужен синхронизированный список, поскольку это shell, которая может использоваться со всеми реализациями списков (связанные списки, списки из Arrays.asList(T...) и т. Д.). Однако, если вам действительно нужна синхронизированная реализация с поддержкой массива, тогда Vector отлично.

Моя интерпретация заключается в том, что у Legacy-кода просто есть более новые копии, которые делают работу лучше. Тем не менее, он будет продолжать получать исправления ошибок и другую поддержку. С другой стороны, устаревший код не поддерживается и не будет получать исправленные исправления.

Давайте будем гением компьютера.