У меня есть этот метод 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 у меня такое же поведение. Кроме того, я проверил настройку «Редактор: Показать устаревшие», и она включена. Почему это не показано?
Нет, я вызываю это из неустаревшего класса и метода (см. обновленный исходный вопрос)
Здравствуйте, является ли расширенная версия, которую вы используете, последней версией? Например, Language support for Java ™ for Visual Studio Code
. Есть ли в ЛИНТЕРе подсказка об устаревании?
Устаревший тег будет применять зачеркивание к окончательному коду только в том случае, если вы получаете доступ к методу из другого класса/модуля. В описании 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().
ОП объявляет устаревшим метод, а не модуль, поэтому ваши рассуждения неприменимы.
Я попробовал это, но до сих пор нет зачеркивания - см. Отредактированные сведения об исходном вопросе.
@Dave Может быть, ты используешь цветовую тему? Если вы используете собственную тему, возможно, в ней не будет зачеркивания в качестве параметра отображения. Может быть, попробовать переключиться на другую тему и посмотреть, не появляются ли они по-прежнему? Спасибо!
Я также проверил "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, чтобы оно повлияло на все мои проекты.
Вы вызываете его из устаревшего метода? (В аналогичной ситуации в C# вызов одного устаревшего/устаревшего метода из другого не выдает предупреждений и т. д., поскольку это довольно распространенное явление, когда целый набор методов одновременно становится устаревшим.) Если вы вызываете его из неустаревший метод/класс/модуль, это другое дело. Что происходит с устаревшими методами из базового пакета, например звонишь
new Date(124, 7, 31)
?