Что означает @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

Ответ 1

Что значит отметить параметр метода или локальную переменную как @Deprecated?

Он имеет то же значение, что и при применении к любому другому элементу:

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


Почему компилятор не пропускает предупреждения для устаревших параметров и полей в Java 7?
Потому что именно то, что диктует JLS (& sect; 9.6.3.6).

Компилятор Java должен выдать предупреждение о сохранении, когда используется тип, метод, поле или конструктор, объявление которого аннотируется аннотацией @Deprecated (т.е. переопределено, вызывается или ссылается по имени), если:

  • Использование находится внутри объекта, который сам аннотируется аннотацией @Deprecated; или

  • Использование в сущности, аннотированной для подавления предупреждения с помощью аннотации @SuppressWarnings("deprecation"); или

  • Использование и декларация находятся в одном и том же самом внешнем классе.

Использование аннотации @Deprecated в объявлении локальной переменной или в объявлении параметра не имеет эффекта.

(выделено курсивом)

Ответ 2

JLS прямо заявляет, что аннотация @Deprecation игнорируется локальными переменными. См. Ответ Matt Ball.

Это что-то, что они могут реализовать в будущем?

Я очень сомневаюсь в этом.

  • Что это может означать... помимо его текущего значения в качестве неофициального напоминания разработчику (и, возможно, шашки стиля /PMD/FindBugs/etc ), что локальная переменная должна быть удалена.

  • Любое изменение материала, вероятно, нарушит совместимость источников для людей, которые в настоящее время используют аннотацию, как указано выше. Хранители Java очень стараются не нарушать старый код.