Устаревшие методы Java не отображаются зачеркиванием в коде Visual Studio

У меня есть этот метод Java:

/**
 * Old method is deprecated.
 * @deprecated Use {@link #newMethod()} instead.
 * @return boolean
 */
@Deprecated
public static boolean oldMethod() {
  return false;
}

а затем позже:

boolean result = oldMethod();

В редакторе VS Code oldMethod() не отображается с зачеркиванием, как в NetBeans (и других достойных IDE). Как ни странно, это отображается как зачеркивание во всплывающем окне завершения кода, но не в окончательном коде.

Я также попробовал вызвать метод из другого класса, но проблема осталась та же:

public class Class2 {
  void example() {
    Class1.oldMethod();
  }
}

Я использую расширение языкового сервера Apache NetBeans, однако при использовании расширений Oracle, Red Hat и Microsoft у меня такое же поведение. Кроме того, я проверил настройку «Редактор: Показать устаревшие», и она включена. Почему это не показано?

Вы вызываете его из устаревшего метода? (В аналогичной ситуации в C# вызов одного устаревшего/устаревшего метода из другого не выдает предупреждений и т. д., поскольку это довольно распространенное явление, когда целый набор методов одновременно становится устаревшим.) Если вы вызываете его из неустаревший метод/класс/модуль, это другое дело. Что происходит с устаревшими методами из базового пакета, например звонишь new Date(124, 7, 31)?

Jon Skeet 31.08.2024 13:35

Нет, я вызываю это из неустаревшего класса и метода (см. обновленный исходный вопрос)

Dave 31.08.2024 19:49

Здравствуйте, является ли расширенная версия, которую вы используете, последней версией? Например, Language support for Java ™ for Visual Studio Code. Есть ли в ЛИНТЕРе подсказка об устаревании?

Jeanneli 02.09.2024 08:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Устаревший тег будет применять зачеркивание к окончательному коду только в том случае, если вы получаете доступ к методу из другого класса/модуля. В описании Java Deprecated указано: «Устаревший модуль не вызывает выдачу предупреждений об использовании типов внутри модуля». (Документация Oracle) Например, если бы я создал класс с устаревшим методом, как вы сказал,

public class Class1 {

@Deprecated
public static boolean oldMethod() {
    return false;
}
public static void run() {
    boolean result = oldMethod();
}

тогда вызов oldMethod() не приведет к визуальному зачеркиванию. Однако, если бы я создал еще один класс как таковой,

public class Class2 {

public static void run() {
    boolean result = Class1.oldMethod();
}

}

тогда это визуально приведет к зачеркиванию: Class1.OldMethod().

ОП объявляет устаревшим метод, а не модуль, поэтому ваши рассуждения неприменимы.

Mark Rotteveel 31.08.2024 13:29

Я попробовал это, но до сих пор нет зачеркивания - см. Отредактированные сведения об исходном вопросе.

Dave 31.08.2024 19:50

@Dave Может быть, ты используешь цветовую тему? Если вы используете собственную тему, возможно, в ней не будет зачеркивания в качестве параметра отображения. Может быть, попробовать переключиться на другую тему и посмотреть, не появляются ли они по-прежнему? Спасибо!

David T. 04.09.2024 07:13
Ответ принят как подходящий

Я также проверил "editor.showDeprecated": true у меня не работает.

Поигравшись с конфигурациями VS Code, я нашел решение.

Решение: обновите .vscode/settings.json вашего проекта Java, чтобы иметь editor.semanticTokenColorCustomizations, который можно использовать для настройки семантики.

Скриншот локации settings.json, которая будет присутствовать в вашем проекте:

settings.json:

{
  ......

  "editor.showDeprecated": true,
  "editor.suggest.showDeprecated": true,
  "editor.semanticTokenColorCustomizations": {
    "enabled": true,
    "rules": {
      "*.deprecated": { 
         "strikethrough": true
      }
    }
  }
}

Скриншот Java-кода:

Как только вы используете аннотацию @Deprecated, она будет зачеркнута.

Это сделало это! Спасибо - я не могу поверить, что это не работает «из коробки» с различными языковыми серверами Java. Кстати, я внес это изменение в свой пользовательский файл settings.json, чтобы оно повлияло на все мои проекты.

Dave 04.09.2024 19:18

Другие вопросы по теме