Чи неправильно використовувати застарілі методи або класи на Java?


153

Я використовую eclipse для розробки веб-додатків. Просто сьогодні я оновив свою версію стійок, змінивши файл JAR. Десь я отримую застереження, що методи застарілі, але код працює нормально.

Я хочу знати деякі речі

  1. Чи неправильно використовувати застарілі методи або класи на Java?

  2. Що робити, якщо я не зміню жоден метод і запускаю свою програму із попередженнями, які у мене є, це створить будь-яку проблему з продуктивністю.


7
Ви б продовжували їздити, 1955 Volkswagen Beetleнавіть якщо вам пропонують Corvette Stingrayбезкоштовно? (0:
KMån

75
@KMan ви порівнюєте європейську машину з американською машиною ?;)
понзао

2
@Ponzao та 4інші: (0;
KMån

2
Неправильно? Ми говоримо тут про смертельне чи просто пристойне змалювання?
FastAl

5
@Alexander не голосує за ваш коментар, тож +1 для вашого теж;) у будь-якому випадку, стійкий, щоб новий код на 1000 кращий за старий. Порівняння було б краще між новими шинами 1955 Volkswagen Beetleта 1956 Volkswagen Beetleз новими, які ви не знаєте, коли зламаються!
Алекс

Відповіді:


265

1. Чи неправильно використовувати застарілі методи або класи на Java?

З визначення застарілого :

Програмний елемент із зауваженням @Deprecated - це той, який програмісти не рекомендують використовувати, як правило, тому, що це небезпечно, або тому, що існує краща альтернатива.

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

2. Що робити, якщо я не зміню жоден метод і запускаю свою програму із попередженнями, які у мене є, це створить якісь проблеми з продуктивністю.

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


Смішна несхвалення в Java API, це ІМО, то FontMetrics.getMaxDecent. Причина депресії: орфографічна помилка.

Застарілий. Станом на версію 1.1.1 JDK, замінено на getMaxDescent ().


5
Наступною смішною депрекацією в Java API буде встановленоMultiClickThreshhold (int threshhold) та getMultiClickTreshhold () в AbstractButton (Swing). Приготуйся до цих двох! ;)
JavaTechNI

3
Нам це потрібно зробити за допомогою HTTP REFERER. It
madinging

1
@DaveMcClelland, зробив 70 із 69: D;)
VdeX

28

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


1
Як ви можете бути впевнені, що це без зміни продуктивності? Зображення може, наприклад, бути пов’язане зі зміною внутрішньої структури даних, скажімо, з HashSet на TreeSet, наприклад.
aioobe

@aioobe - Наскільки я розумію, ОП запитала, чи має виклик застарілого коду проблеми з продуктивністю, і він не враховує, що він не змінює створений байтовий код (раніше 1,5 було в javadoc, зараз використовується анотація, але досі немає змін у виконанні)
abyx

Переходячи від однієї версії бібліотеки до іншої, немає гарантії, що байт-код методу в новій версії ідентичний байтовому коду того ж методу в попередній версії.
aioobe

@aioobe - є гарантія, що просто застарівши, не зміниться байт-код, що саме я вважав, що ОП мав на увазі. Звичайно, сам код змінюється, через що ми знецінюємо код.
абікс

Якщо ви продовжуєте використовувати ту ж версію, що і раніше, змін не буде. Але якщо ви користуєтеся новою версією бібліотеки, і у них немає застарілого API, МОЖЕ бути зміни в продуктивності, якщо основна реалізація буде кардинально змінена і новий API використовує її, тоді як старіший API не є таким ефективніше, як це було раніше, проти цієї нової структури.
gregturn

21

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

З офіційного словника НД:

застаріле : посилається на клас, інтерфейс, конструктор, метод або поле, які більше не рекомендується, і може перестати існувати в майбутній версії.

З того, як і коли знецінювати посібник:

Можливо, ви чули термін «гуморець, що самовиражається», або гумор, який мінімізує важливість мовця. Знищений клас або метод є таким. Це вже не важливо. Насправді це настільки неважливо, що ви більше не повинні його використовувати, оскільки він був замінений і може припинити своє існування в майбутньому.

@DeprecatedАнотацію пішов ще далі і попередити про небезпеку:

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

Список літератури


Правильно чи неправильно?

Питання про те, правильно чи неправильно використовувати застарілі методи, доведеться вивчати індивідуально. Ось ВСІ цитати, де слово "застаріле" з'являється в " Ефективній Java 2-го видання" :

Пункт 7: Уникайте фіналізаторів : Єдиними методами, які претендують на гарантію доопрацювання, є System.runFinalizersOnExitйого злий близнюк Runtime.runFinalizersOnExit. Ці методи мають фатальний хиб і були присуджені.

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

Пункт 70: Безпека ниток документа : System.runFinalizersOnExitМетод є ворожим і є застарілим.

Пункт 73: Уникайте груп ниток : вони дозволяють застосувати певні Threadпримітиви до групи ниток відразу. Деякі з цих примітивів були застарілими, а решта використовуються нечасто. [...] групи ниток застаріли.

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

З іншими методами вам доведеться розглядати проблеми окремо і розуміти, чому вони були застарілими, але загалом кажучи, коли рішення про депресію виправдане, воно, як правило, схиляється до неправильного, ніж право, щоб продовжувати їх використовувати.

Пов'язані питання


3
"Застарілий" - від латинського "de" + "precare", що означає "молитися проти". Коли щось описується як застаріле, Стандарт молиться - благає - ви не користуєтесь цим; це попередження про те, що він може бути видалений у майбутній версії цього стандарту. Зауважте, що застаріла функція необхідна для повного впровадження в будь-яку реалізацію поточної версії цього стандарту. Ваша згадка про самоусудливий гумор трохи не помітна; "самодепресивне" в цьому сенсі - це розбещення "самоослаблення", яке має різну деривацію та значення.
dajames

17

Крім усіх відмінних відповідей вище, я виявив, що є ще одна причина для видалення застарілих викликів API.

Досліджуючи, чому виклик застарілий, я часто знаходжу цікаві речі про Java / API / Framework. Часто є вагома причина, чому метод застарілий, і розуміння цих причин призводить до глибшого розуміння.

Отже, з точки зору навчання / зростаючого, це також варте зусиль


11

Це, безумовно, не створює проблеми з продуктивністю - застарілі засоби в майбутньому, швидше за все, ця функція більше не буде частиною бібліотеки, тому вам слід уникати використання її в новому коді та змінити старий код, щоб припинити його використання, тому ви не зіткнетесь із проблемами одного дня, коли оновите стійки та виявите, що функція більше не присутня


1
Судячи з досвіду, "застарілий" насправді означає "ви більше не повинні використовувати це, але воно буде доступне навіки і назавжди". Принаймні, для Java Standard API я не знаю жодного методу чи класу, який коли-небудь фактично видалявся після його застарілого.
Майкл Боргвардт

1
@Michael Добре, що на практиці API рідко видаляють застарілі функції, тому що вони можуть бути застаріли протягом десяти років, якщо компілятори видають "ПОПЕРЕДЖЕННЯ: ЗАСТОСУЙТЕ ВИКОРИСТАННЯ ВАМИ", і люди все одно вивернуть день, коли вони остаточно його видалили. Я думаю, що застаріле має означати "колись ми хочемо це вийняти, тому, будь ласка, припиніть його використовувати", навіть якщо на практиці це рідко трапляється насправді
Майкл Мрозек

@Michael Mrozek: Не згоден із твердженням It certainly doesn't create a performance issue; це занадто суб'єктивно, щоб стверджувати, що.
KMån

1
@KMan Функція, позначена як устарена, якось не робить її менш ефективною, ніж була раніше, але вона буде працювати точно так само, як і раніше
Майкл Мрозек

@Michael Borgwardt: Ось як це працює в більшості стандартизованих мов. І, звичайно, якщо що-небудь застаріле потрібно було видалити зі стандарту, популярні реалізації зберігатимуть це як розширення.
Девід Торнлі

8

Це не помиляється, просто не рекомендується. Зазвичай це означає, що на даний момент існує кращий спосіб робити речі, і ви б зробили добро, якщо будете використовувати новий вдосконалений спосіб. Деякі застарілі речі справді небезпечні, і їх слід уникати взагалі. Новий спосіб може дати кращі показники, ніж застарілий, але це не завжди так.


8

Можливо, ви чули термін «гуморець, що самовиражається». Це гумор, який мінімізує вашу важливість. Знищений клас або метод є таким. Це вже не важливо. Насправді це настільки неважливо, що його більше не можна використовувати, оскільки воно, мабуть, перестане існувати в майбутньому.

Намагайтеся уникати цього


4
  1. Як правило, ні, не зовсім неправильно використовувати deprecatedметоди, якщо у вас є хороший план дій на випадок уникнення будь-яких проблем, якщо / коли ці методи зникнуть з бібліотеки, яку ви використовуєте. З самим Java API цього ніколи не відбувається, але майже все інше означає, що його буде видалено. Якщо ви спеціально плануєте не оновлювати ( хоча це, швидше за все, слід у довгостроковій перспективі ) підтримувати бібліотеки вашого програмного забезпечення, тоді у використанні deprecatedметодів немає проблем .
  2. Немає.

3

Так, це неправильно.

Застарілі методи або класи будуть видалені в майбутніх версіях Java і не повинні використовуватися. У кожному випадку повинна бути альтернатива. Використовуйте це.

Є кілька випадків, коли для досягнення мети проекту вам доведеться використовувати застарілий клас чи метод. У цьому випадку у вас справді не залишається іншого вибору, як використовувати його. Майбутні версії Java можуть порушити цей код, але якщо це вимога, вам доведеться жити з цим. Це, мабуть, не перший раз, коли вам довелося зробити щось не так, щоб відповідати вимозі проекту, і це, звичайно, не буде останнім.

Коли ви переходите на нову версію Java або якусь іншу бібліотеку, іноді метод або клас, які ви використовували, застаріли. Застарілі методи не підтримуються, але не повинні давати несподіваних результатів. Це не означає, що вони не стануть, тому перемкніть свій код якнайшвидше.

Процес амортизації існує, щоб переконатися, що авторам вистачає часу для зміни коду зі старого API на новий API. Скористайтеся цим часом. Змініть код якнайшвидше.


2

Це не є помилковим, але деякі застарілі методи видаляються у майбутніх версіях програмного забезпечення, тому, можливо, ви отримаєте непрацюючий код.


Removed? Див визначення stackoverflow.com/questions/2941900 / ...
Kman

1
@KMan - у посиланні, яке ви опублікували, написано - "Метод зберігається в API для зворотної сумісності протягом не визначеного періоду часу, і в майбутніх випусках може бути ВІДНОВЛЕНО." Я написав те саме - деякі застарілі методи, можливо, будуть усунені в найближчому чи далекому майбутньому.
Петро Мінчев

2

Чи неправильно використовувати застарілі методи або класи на Java? "

Не помиляється як таке, але це може врятувати вам певні неприємності. Ось приклад, коли категорично не рекомендується використовувати застарілий метод:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Чому тема Thread.stop застаріла?

Тому що це по своїй суті небезпечно. Якщо зупинити потік, це призведе до розблокування всіх заблокованих моніторів. (Монітори розблоковані, коли виняток ThreadDeath поширює стек.) Якщо будь-який із об'єктів, попередньо захищених цими моніторами, знаходився в непослідовному стані, інші потоки тепер можуть переглядати ці об'єкти в непослідовному стані. Кажуть, такі об'єкти пошкоджені. Коли нитки діють на пошкоджених об'єктах, може виникати довільна поведінка. Така поведінка може бути тонкою і важко виявити, або вона може бути яскраво вираженою. На відміну від інших неперевірених винятків, ThreadDeath мовчки вбиває теми; таким чином, користувач не попереджає, що його програма може бути пошкоджена. Корупція може проявитись у будь-який час після фактичної шкоди, навіть годин чи днів у майбутньому.


Що робити, якщо не змінити жоден метод і запустити мою програму із попередженнями, які у мене є, це створить якісь проблеми з продуктивністю.

Не повинно бути жодних проблем щодо продуктивності. Стандартний API призначений для дотримання деякої відсталої сумісності, тому програми можна поступово адаптувати до новіших версій Java.


2

Чи неправильно використовувати застарілі методи або класи на Java? Це не "неправильно", все ще працює, але уникайте цього максимально.

Припустимо, існує вразливість безпеки, пов'язана з методом, і розробники визначають, що це вада дизайну. Тож вони можуть вирішити зневажити метод і ввести новий спосіб.

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

що якщо не змінити жоден метод і запустити мою програму із попередженнями, що у мене є, це створить будь-яку проблему з продуктивністю.

Якщо депресія пов’язана з проблемою ефективності, тоді ви будете страждати від продуктивності, інакше немає жодної причини мати таку проблему. Знову хотілося б зазначити, будьте в курсі причини знецінення.


2

У Java це @Deprecated, у C # - [Застаріле].

Я думаю, що я віддаю перевагу термінології C #. Це просто означає, що вона застаріла. Ви все ще можете використовувати його, якщо хочете, але, мабуть, є кращий спосіб.

Це як використовувати Windows 3.1 замість Windows 7, якщо ви вважаєте, що Windows 3.1 застаріла. Ви все ще можете використовувати його, але, можливо, в майбутній версії є кращі функції, а також майбутні версії, можливо, будуть підтримуватися - застарілої не буде.

Те саме для Java @Deprecated - ви все ще можете використовувати метод, але на свій страх і ризик - в майбутньому він може мати кращі альтернативи і може навіть не підтримуватися.

Якщо ви використовуєте код, який є застарілим, зазвичай це нормально, доки вам не доведеться переходити на новіший API - застарілий код там може не існувати. Я пропоную, якщо ви бачите щось, що використовує застарілий код, оновити, щоб використовувати новіші альтернативи (зазвичай це вказується в примітці або в застарілому коментарі Javadoc).

Редагувати: І як зазначав Майкл, якщо причина депресії пов’язана з недоліком функціональності (або тому, що функціональність навіть не повинна існувати), то, очевидно, не слід використовувати застарілий код.


1
"Якщо ви використовуєте код, який застарів, це добре, доки вам не доведеться переходити на новіший API" - не зовсім. Подивіться, чому тема Thread.stop () застаріла, і ви побачите, що це не добре, в будь-якій версії JRE.
Майкл

Гаразд, я повинен сказати "звичайно" добре (оновить цей біт) :) Отже, використовуйте на свій страх і ризик. Очевидно, що якщо причина знецінення цього полягає в припиненні недоліків у його функціональності, є сенс не використовувати його. Взагалі, однак, непогано застосовувати застарілий метод. Так що, все залежить від причини знецінення. Правда.
jamiebarrow

1

Звичайно, ні - оскільки вся Java отримує @Deprecated :-), ви можете сміливо користуватися ними, поки триває Java. Ні в якому разі не помічаю жодної різниці, якщо тільки щось справді не зламане. Значення - треба прочитати про це, а потім вирішити.

Однак у .Net, коли щось оголошено [застарілим], перейдіть і прочитайте про це негайно, навіть якщо ви ніколи цього не використовували - у вас є приблизно 50% шансів, що це більш ефективно та / або простіше у використанні, ніж заміна :-))

Так що в цілому може бути цілком вигідним бути техноконсервативним в наші дні, але спочатку ви повинні виконати свою роботу з читання.


1

Я відчуваю, що застарілий метод означає; доступний альтернативний метод = ive, який кращий у всіх аспектах, ніж існуючий метод. Краще використовувати хороший метод, ніж існуючий старий метод. Для зворотної сумісності старі методи залишаються як застарілі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.