Разница между устаревшим и устаревшим API? - PullRequest
32 голосов
/ 20 мая 2010

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

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

Ответы [ 7 ]

28 голосов
/ 20 мая 2010

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

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

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

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

Аннотация @Deprecated пошла еще дальше и предупреждает об опасности:

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

Ссылки


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

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

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


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

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

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

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

Элемент 70: Безопасность потока документов : Метод System.runFinalizersOnExit является враждебным по отношению к потокам и является устаревшим.

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

Напротив, в этих кавычках появляется слово "legacy" :

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

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

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

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

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

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

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

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

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

14 голосов
/ 20 мая 2010

Распространенным толкованием является то, что «Устаревшее» означает, что оно будет удалено в ближайшем будущем, а «Наследие» означает, что оно останется для обратной совместимости или по другим причинам.

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

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

0 голосов
/ 20 мая 2010

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

0 голосов
/ 20 мая 2010

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

Legacy просто означает, что оно старое, и есть способы сделать что-то, что, как правило, но не обязательно, лучше. Хороший пример - Vector - это реализация List, но она все еще немного уродлива за несколько дней до разработки API коллекций (т.е. List). Он также синхронизирован, что означает, что вы должны платить за синхронизацию, даже если используете его в однопоточном сценарии (за исключением некоторых ситуаций, когда виртуальная машина умна). ArrayList лучше, если вам нужна реализация списка на основе массива, поскольку она не синхронизирована, а Collections.synchronizedList более гибкая, если вам нужен синхронизированный список, поскольку это оболочка, которая может использоваться со всеми реализациями списков (связанные списки, списки из *) 1011 * и т. Д.). Однако, если вам do понадобится синхронная реализация списка с массивами, тогда Vector подойдет.

0 голосов
/ 20 мая 2010

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

0 голосов
/ 20 мая 2010

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

0 голосов
/ 20 мая 2010

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

...