Это неправильно использовать устаревшие методы или классы в Java? - PullRequest
148 голосов
/ 31 мая 2010

Я использую Eclipse для разработки веб-приложения. Только сегодня я обновил свою версию Struts, изменив файл JAR. В некоторых местах я получаю предупреждения о том, что методы устарели, но код работает нормально.

Я хочу знать кое-что

  1. Неправильно ли использовать устаревшие методы или классы в Java?

  2. Что, если я не изменю какой-либо метод и не запусту свое приложение с предупреждениями, которые у меня есть, это создаст какую-либо проблему с производительностью.

Ответы [ 15 ]

258 голосов
/ 31 мая 2010

1.Неправильно ли использовать устаревшие методы или классы в Java?

С определение устаревшего :

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

Метод сохраняется в API для обратной совместимости длянеопределенный период времени и может быть в будущих выпусках удален.То есть, нет, это не неправильно , но есть лучший способ сделать это, более устойчивый к изменениям API.

2.Что, если я не изменю какой-либо метод и не запусту свое приложение с предупреждениями, которые у меня есть, создаст ли это проблему с производительностью.

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


Самый смешной устаревший в Java API,Это IMO, FontMetrics.getMaxDecent.Причина устаревания: орфографическая ошибка.

Устарело.Начиная с версии JDK 1.1.1, заменено getMaxDescent ().

27 голосов
/ 31 мая 2010

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

21 голосов
/ 31 мая 2010

Терминология

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

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

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

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

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

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

Ссылки


Правильно или нет?

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

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

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

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

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

Так что, по крайней мере, со всеми вышеперечисленными методами, явно неправильно использовать их, по крайней мере, согласно Джошу Блоху.

При использовании других методов вам придется рассматривать вопросы по отдельности и понимать, ПОЧЕМУ они устарели, но в целом, когда решение о прекращении признания оправдано, оно склонно склоняться к неправильному право продолжать использовать их.

Похожие вопросы

17 голосов
/ 31 мая 2010

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

Исследуйте, почему вызов устарел. Я часто узнаю интересные вещи о Java / API / Framework. Часто существует веская причина, по которой метод считается устаревшим, и понимание этих причин ведет к более глубокому пониманию.

Таким образом, с точки зрения обучения / роста, это также стоит усилий

11 голосов
/ 31 мая 2010

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

8 голосов
/ 20 августа 2010

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

Старайтесь избегать этого

7 голосов
/ 31 мая 2010

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

4 голосов
/ 31 мая 2010
  1. Как правило, нет, использование deprecated методов не является абсолютно неправильным, если у вас есть хороший план действий в чрезвычайных ситуациях, чтобы избежать каких-либо проблем, если / когда эти методы исчезнут из используемой вами библиотеки. С самим Java API этого никогда не происходит, но практически со всем остальным это означает, что он будет удален. Если вы специально планируете не обновлять (, хотя, скорее всего, в долгосрочной перспективе ), библиотеки поддержки вашего программного обеспечения, то нет проблем с использованием deprecated методов.
  2. номер
3 голосов
/ 26 августа 2010

Да, это неправильно.

Устаревшие методы или классы будут удалены в будущих версиях Java и не должны использоваться. В каждом случае должна быть доступная альтернатива. Используйте это.

Есть несколько случаев, когда вам нужно использовать устаревший класс или метод для достижения цели проекта. В этом случае у вас действительно нет другого выбора, кроме как использовать его. Будущие версии Java могут нарушить этот код, но если это требование, вы должны жить с этим. Вероятно, это не первый раз, когда вам приходится что-то делать не так, чтобы выполнить требования проекта, и, конечно, это не будет последним.

Когда вы обновляете Java до новой версии или какой-либо другой библиотеки, иногда используемый вами метод или класс устаревают. Устаревшие методы не поддерживаются, но не должны давать неожиданных результатов. Это не значит, что они этого не сделают, поэтому переключайте свой код как можно скорее.

Процесс устаревания предназначен для того, чтобы у авторов было достаточно времени, чтобы изменить свой код со старого API на новый API. Используйте это время. Измените свой код как можно скорее.

2 голосов
/ 31 мая 2010

Это неправильно использовать устаревшие методы или классы в Java? Это не «неправильно», все еще работает, но избегайте этого как можно больше.

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

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

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

...