Что означает @Deprecated для параметров метода и локальных переменных?
отказ от ответственности: я знаю смысл и цель @Deprecated
.
определение @Deprecated
аннотация выглядит так в исходном коде Java:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
Я понимаю цель иметь целевые значения CONSTRUCTOR
, FIELD
, TYPE
, METHOD
и PACKAGE
.
однако, что значит пометить параметр метода или локальную переменную как @Deprecated
?
странно приведенный ниже пример компилируется без каких-либо предупреждение.
interface Doable {
void doIt(@Deprecated Object input);
}
class Action implements Doable {
@Override
public void doIt(@Deprecated Object input) {
String string = String.valueOf(input); // no warning!
@Deprecated
String localVariable = "hello";
System.out.println("Am I using a deprecated variable?" + localVariable); // no warning!
}
}
это то, что они намерены реализовать в будущем?
FWIW, я использую JDK 1.7.0_11 на Ubuntu 12.04 64bit. Результат тот же, запускаю ли я программу из Eclipse или командной строки.
компилятор выплевывает предупреждения для нормальный использование @Deprecated
, например, использование одного из устаревших конструкторов java.util.Date
класса. Просто чтобы доказать, что у меня нет неисправного терминала или настройки, вот результат:
$ javac com/adarshr/Test.java -Xlint:deprecation
com/adarshr/Test.java:12: warning: [deprecation] Date(int,int,int) in Date has been deprecated
new Date(2013, 1, 31);
^
1 warning
$
$ javac -version
javac 1.7.0_11
2 ответов
что значит пометить параметр метода или локальную переменную как
@Deprecated
?
это то же значение, что и при применении к любому другому элементу:
программный элемент с аннотацией
@Deprecated
Это тот, который программисты не рекомендуют использовать, как правило, потому, что это опасно, или потому, что существует лучшая альтернатива. Компиляторы предупреждают, когда устаревший элемент программы используется или переопределяется в non-deprecated код.
почему компилятор не опускает предупреждения для устаревших параметров и полей в Java 7?
потому что это именно то, что диктует JLS (§ 9.6.3.6).
компилятор Java должен выдавать предупреждение об устаревании, когда тип, метод, поле или конструктор, объявление которого аннотируется аннотацией
@Deprecated
используется (т. е. переопределяется, вызывается или ссылается по имени), если:
использование находится внутри сущности, которая сама аннотируется аннотацией @Deprecated; или
использование находится в сущности, которая аннотируется, чтобы подавить предупреждение с аннотацией
@SuppressWarnings("deprecation")
; илииспользование и объявление находятся в одном и том же внешнем классе.
использование
@Deprecated
аннотация объявления локальной переменной или объявления параметра не действовать.
(курсив)
JLS явно заявляет, что аннотация @Deprecation игнорируется для локальных переменных. См. ответ Мэтта Болла.
Это то, что они намерены реализовать в будущем?
Я очень сомневаюсь в этом.
Что это может означать ... помимо его текущего значения в качестве неофициального напоминания исполнителю (и, возможно, шашки стиля / PMD / FindBugs / etc), что локальная переменная должна быть удаленный.
любой материал изменение может нарушить совместимость источников для людей, которые в настоящее время используют аннотацию, как указано выше. Сопровождающие Java очень стараются избежать взлома старого кода.