Как используется @Deprecated?
Этой аннотацией помечают код, который устарел и не должен быть более использован. Классы, которые используют или переопределяют @Deprecated элементы, будут компилироваться с warning-ом.
Имеет retention RUNTIME , что значит, что фреймворки могут динамически проверять наличие аннотации на элементе с помощью Reflection API.
Начиная с Java 9 у этой аннотации появились опциональные параметры – строка since и булево значение forRemoval . В since указывается версия вашего приложения, начиная с которой элемент считается устаревшим. Значение true в forRemoval предупреждает, что со следующей мажорной версии этот элемент будет удален. Такое нововведение связано с изменением политики устаревания – с Java 9 и устаревшие элементы самой JDK тоже могут удаляться в будущих версиях.
Обычно, когда элемент помечают устаревшим, причины устаревания и дальнейшие рекомендации указывают в его Javadoc-документации под тегом @deprecated .
Deprecated Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Use IDeprecated interface instead
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
[Android.Runtime.Register("java/lang/Deprecated", DoNotGenerateAcw=true)] [System.Obsolete("Use IDeprecated interface instead")] public abstract class Deprecated : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.Lang.Annotation.IAnnotation
[] [] type Deprecated = class inherit Object interface IAnnotation interface IJavaObject interface IDisposable interface IJavaPeerable
Наследование
Deprecated
Реализации
Комментарии
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать. Элемент может быть нерекомендуем по любой из нескольких причин, например, его использование может привести к ошибкам; она может быть изменена несовместимо или удалена в следующей версии; она была заменена более новой, обычно предпочтительной альтернативой; или является устаревшим.
Компиляторы выдают предупреждения при использовании или переопределении нерекомендуемого программного элемента в нерекомендуемом коде. Использование заметки @Deprecated для объявления локальной переменной, объявления параметра или объявления пакета не влияет на предупреждения, выдаваемые компилятором.
Если модуль является устаревшим, использование этого модуля в requires предложениях , но не в exports предложениях или opens вызывает предупреждение. Нерекомендуемый <>модуль не<> вызывает предупреждения об использовании типов в модуле.
Этот тип заметки содержит элемент since со строковым значением . Значение этого элемента указывает версию, в которой элемент программы с заметками был впервые объявлен нерекомендуемым.
Этот тип заметки имеет элемент forRemoval с логическим значением . Значение true указывает на намерение удалить элемент программы с заметками в будущей версии. Значение false указывает, что использование элемента программы с заметками не рекомендуется, но на момент добавления заметки к элементу программы не было конкретного намерения удалить его.
Добавлено в версии 1.5.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.
Конструкторы
Является устаревшей.
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.
Свойства
Является устаревшей.
Возвращает класс среды выполнения данного объекта Object .
Является устаревшей.
Дескриптор базового экземпляра Android.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.
Является устаревшей.
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.
Методы
Является устаревшей.
Возвращает интерфейс заметки для этой заметки.
Является устаревшей.
Создает и возвращает копию этого объекта.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Указывает, равен ли какой-то другой объект этому объекту.
Является устаревшей.
Возвращает значение хэш-кода для объекта.
Является устаревшей.
Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект .
Является устаревшей.
Пробуждение одного потока, ожидающего на мониторе этого объекта.
Является устаревшей.
Активирует все потоки, ожидающие на мониторе этого объекта.
Является устаревшей.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Возвращает строковое представление объекта.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за или .
Является устаревшей.
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за em>, <>прерывания < или>em, либо до истечения определенного количества реального времени.
Является устаревшей.
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за em>, <>прерывания < или>em, либо до истечения определенного количества реального времени.
Явные реализации интерфейса
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Методы расширения
Является устаревшей.
Выполняет преобразование типа, проверенное средой выполнения Android.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Является устаревшей.
Программный элемент с заметками @Deprecated — это элемент, который программистам не рекомендуется использовать.
Чем заменять deprecated методы

В студии это выглядит так: Вопрос: чем заменять такие методы, и где можно найти актуальные методы которые могут заменить функционал deprecated-метода.
Отслеживать
задан 25 фев 2016 в 10:07
Kirill Stoianov Kirill Stoianov
6,148 6 6 золотых знаков 30 30 серебряных знаков 66 66 бронзовых знаков
25 фев 2016 в 10:13
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Найти актуальные методы всегда можно в документации. Конкретно по getDrawable : http://developer.android.com/intl/ru/reference/android/content/res/Resources.html#getDrawable(int) deprecated с API 22.
Указывают, что заменить можно на Context.getDrawable(int) или getDrawable(int, Theme) , передав тему.
Либо использовать библиотеки совместимости, тогда так: ContextCompat.getDrawable(context, R.drawable.***) , тогда не нужны проверки.
Отслеживать
ответ дан 25 фев 2016 в 10:14
15.8k 1 1 золотой знак 18 18 серебряных знаков 35 35 бронзовых знаков
Не забудьте добавить проверку на доступность данного метода в новом API. Например, если новый метод есть только в API 21, то на старых версиях ОС у вас будут ошибки и нужно добавить проверку вида:
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) < //используем новый метод >else < //используем старый deprecated метод >
Отслеживать
15.8k 1 1 золотой знак 18 18 серебряных знаков 35 35 бронзовых знаков
ответ дан 25 фев 2016 в 10:30
5,707 19 19 серебряных знаков 30 30 бронзовых знаков
25 фев 2016 в 10:46
Дело в том что этот метод deprecated. Это значит, что в будущих версиях он будет исключен из SDK. Проверка внутри метода немного другое. В вашем случае нужно использовать этот метод если текущий номер API ниже 22 и новый метод, который в ответе выше если уровень API >= 22.
25 фев 2016 в 10:49
я не уточнил, я говорю про метод ContextCompat.getDrawable() он не deprecated, и в нем внутри происходит проверка!
25 фев 2016 в 11:02
да, ContextCompat можно юзать без проверок. Это класс support library.
25 фев 2016 в 11:23
Идёте на Android developers в поиске вбиваете свой класс, у которого метод устарел, не забудьте предворительно указать версию API в списке пакетов, далее находите описание класса с его полями, методами и т.д., далее ищите свой метод в списке, в описании метода всегда написано, если он устарел, что лучше использовать вместо него, это касается не только методов, но и в целом любых deprecated.
Там в описании чётко написано, что делать.
Отслеживать
ответ дан 25 фев 2016 в 12:26
3,362 19 19 серебряных знаков 35 35 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.17.3574
Введение в аннотации
J2SE содержит множество нововведений в самом языке Java, в том числе поддержка параметризуемых классов (generics) и улучшенного цикла for (enhanced for loop). В предыдущих статьях мы подробно рассказывали о параметризуемых классах и об улученном цикле for, а в этой статье мы рассмотрим аннотации, встроенные в J2SE 5.0.
Что же такое аннотации? Аннотации — они же JSR-175 (Meta-data) — позволяют связывать метаданные с программными элементами (такими как классы, интерфейсы и методы). Они могут служить дополнительными модификаторами без изменения основного кода для своих элементов.
Само введение метаданных в исходный код не является новым для J2SE 5.0. Вы можете добавить тег @deprecated в комментариях к методу в javadoc, и компилятор будет обрабатывать его как метаданные метода. Такая возможность появилась с выходом версии J2SE 1.0. Уже начальный релиз платформы был ориентирован на сокращение использования метода getenv() (хотя это было реализовано только в версии 1.1). Суть осталась той же, за исключением символа @ в синтаксисе. Изменилось только место — тег аннотации перешел в код, а не в комментарий. Преимущество в том, что аннотации являются способом поддержки программной модели объявлений.
Итак, первая аннотация, которая идет с J2SE 5.0: @Deprecated . Обратите внимание, что здесь заглавная буква D. @Deprecated функционально работает в коде также как и @deprecated в javadoc, связанный с классом или методом. С помощью флагов и тега @Deprecated вы сообщаете компьютеру предупредить пользователя, что используется тот или иной класс или метод.
Класс Main содержит метод deprecatedMethod() , у которого флагом является аннотация @Deprecated , а комментарием @deprecated :
public class Main <
<>
/**
* @deprecated устарел. Используйте вместо него Use System.foobar().
*/
@Deprecated
public static void deprecatedMethod () System.out.println ( «Don’t call me» ) ;
>
>
Компилируйте класс с аннотацией так же, как без нее:
> javac Main.java
Как и следовало ожидать, получился класс Main.class .
Если вы используете метод deprecated, то получите предупреждение при компиляции — такое же, как при использовании тега @deprecated в javadoc. Пример:
public class User <
public static void main ( String args []) <
Main.deprecatedMethod () ;
>
>
> javac User.java
и вы увидите следующее предупреждение об использовании класса deprecated:
Note: User.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
User.java использует или заменяет deprecated API. Перекомпилируйте с -Xlint:deprecation, чтобы посмотреть детали. Добавление -Xlint в строку компиляции покажет, что именно не так:
> javac -Xlint:deprecation User.java
User.java: 3 : warning: [ deprecation ] deprecatedMethod () in
Main has been deprecated
Main.deprecatedMethod () ;
^
1 warning
Замена комментария @deprecated на аннотацию @Deprecated не принесет ничего существенно нового в систему. Это слега изменяет способ, но делает все то же самое. А вот следующие две аннотации @Override и @SuppressWarnings действительно меняют функциональность платформы.
Аннотация @Override может использоваться вместе с объявлением метода. После того как вы ввели имя, можете добавить аннотацию @Override для установки значение флага функции, чтобы переписать метод суперкласса. Зачем так делать? Чтобы найти ошибку раньше. Сколько раз вы собирались переписать метод, но то в названии метода была ошибка, то определены неправильные аргументы, а то неверный тип возвращаемого значения? Иными словами, сколько раз вам приходилось создавать новый метод вместо того, чтобы переписать уже существующий? Используя @Override , вы найдете ошибку в текущем классе намного раньше:
public class Overrode <
@Override
public int hashcode () <
return 0 ;
>
@Override
public boolean equals ( Object o ) return true ;
>
>
Здесь ошибка в том, что название метода должно быть hashCode , а не hashcode . Предполагается, что объявление метода находится где-то в описании класса. Если не использовать первую аннотацию @Override , сколько у вас займет времени, чтобы обнаружить, что ваш метод hashCode (с заглваной буквой) не вызывается, и вы получаете некоторый результат по умолчанию от родительского класса Object . Благодаря аннотации @Override , компиляция класса выдаст ошибку, сообщающую вам о проблеме (метод не переписывается из своего суперкласса):
Overrode.java: 2 : method does not override a method from its
superclass
@Override
^
1 error
Чем скорее вы найдете ошибку такого происхождения, время на ее исправление сильно сокращается. Обратите внимание, что метод hashCode никогда не возвращает константу. Более подробное описание использования hashCode и equals() вы найдете в 8 пункте в книге Джошуа Блош «Путеводитель по эффективному программированию на Java».
Последняя из трех новых аннотаций в J2SE 5.0 — @SuppressWarnings — самая интересная. Она сообщает компилятору не предупреждать вас, о чем он обычно предупреждает. Предупреждения относятся к разным категориям, и вы можете сообщить аннотации, какие категории вас интересуют. Компилятор javac определяет семь свойств для вывода предупреждений: все, deprecation, непроверенные, проход при невыполнении условия, неверные пути, последовательные и конечные. (В спецификации языка определены только два из этих типов: deprecation и непроверенные.)
В целях демонстрации, посмотрим на блокировку опции «проход при невыполненных условиях». Начнем со следующего класса. В этом классе пропущено break в каждом случае switch :
public class Fall <
public static void main ( String args []) <
int i = args.length;
switch ( i ) <
case 0 :
System.out.println ( «0» ) ;
case 1 :
System.out.println ( «1» ) ;
case 2 :
System.out.println ( «2» ) ;
case 3 :
System.out.println ( «3» ) ;
default :
System.out.println ( «Default» ) ;
Скомпилируйте класс с помощью javac. Вы увидите, что просто создается файл .class без всяких предупреждений:
javac Fall.java
Если вы хотите, чтобы компилятор предупреждал вас о невыполнении условий switch (т.е. что пропущено одно или более утверждений break ), скомпилируйте с опцией Xlint:fallthrough :
javac -Xlint:fallthrough Fall.java
Вы увидите следующие предупреждения:
Fall.java:6: warning: [fallthrough] possible fall-through into case case 1: System.out.println("1"); ^ Fall.java:7: warning: [fallthrough] possible fall-through into case case 2: System.out.println("2"); ^ Fall.java:8: warning: [fallthrough] possible fall-through into case case 3: System.out.println("3"); ^ Fall.java:9: warning: [fallthrough] possible fall-through into case default : System.out.println("Default"); ^ 4 warnings
Что делать, если вы не придаете значения тому, что в каждом случае switch пропускается break ? Вот где вам пригодится аннотация @SuppressWarnings . Вставьте эту строчку перед объявлением метода main() :
@SuppressWarnings ( «fallthrough» )
Скомпилируйте с опцией -Xlint:fallthrough :
javac -Xlint:fallthrough Fall.java
и получите файл .class без единого предупреждения.
Аннотация @SuppressWarnings может использоваться для подавления других предупреждений, например, когда вы используете коллекции, не указывая типа данных элементов коллекции. Не стоит использовать аннотацию @SuppressWarnings , чтобы просто избежать предупреждений компилятора. Применяйте это там, где нельзя избежать предупреждений, например, при использовании библиотеки, которая не была создана вместе с параметризуемыми классами (generics).
Это что касается встраиваемых аннотаций. Маленькое дополнение: аннотации (со своими аргументами) обычно определяются отдельной строкой сами по себе.
Определяя свои собственные аннотации, вы можете сделать намного больше, чем просто использовать аннотации, введенные в J2SE 5.0. Здесь вы узнаете, как создавать свои аннотации.
A может Вас также заинтересует что-нибудь из этого:
- Java и базы данных → Hibernate: Пользовательские типы в hibernate. Разбираемся с UDT
- Java Standard Edition → Аннотации в Java (java annotation types). Пример 1
- Java Standard Edition → Java аннотации пример 1
- Java и базы данных → Hibernate: Пользовательские типы в hibernate. Разбираемся с компонентами
- Разное → Теория и практика Java: Динамическая компиляция и измерение производительности
- Java сниппеты → Методы для работы с переменным количеством аргументов