Может ли @SuppressWarnings (устаревание) применяться к использованию устаревшего интерфейса без применения ко всему классу?

У меня есть устаревший код, реализующий устаревший интерфейс. Этот конкретный компонент скоро станет устаревшим и будет удален сам, поэтому нет смысла проводить рефакторинг для устранения основной причины предупреждения компилятора. Вместо этого я хотел бы подавить это. Однако я НЕ хочу, чтобы область подавления распространялась на весь класс.

Первоначально код был:

public class Foo 
  extends 
    Bar 
  implements 
    DeprecatedBaz, 
    Qux { ... }

DeprecatedBaz - это интерфейс, который был помечен как @Deprecated и является сторонней структурой, что означает, что я не могу удалить @Deprecated. Я хотел бы подавить предупреждение, но не устаревание для всего класса. По сути, я хотел бы написать:

public class Foo
  extends 
    Bar 
  implements
    @SuppressWarnings("deprecation") 
    DeprecatedBaz, 
    Qux { ... }

Однако это недопустимый синтаксис и не анализируется. Так что дальше я надеялся, что смогу сделать это при импорте, но этот сообщение SO, похоже, подразумевает, что это должно быть сделано на уровне класса.

В качестве альтернативы я думал, что потенциальное применение его ко всем методам, которые требует реализации интерфейса, может решить проблему, но это тоже не сработало.

Кажется, я вынужден применить аннотацию на уровне класса:

@SuppressWarnings("deprecation")
public class Foo
  extends 
    Bar 
  implements 
    DeprecatedBaz, 
    Qux { ... }

Мне это не нравится, потому что, если кто-то редактирует этот класс и вводит новый код, который относится к устаревшему коду, предупреждение будет проглочено.

Есть ли способ ограничить объем в этом случае?


person cclark    schedule 23.05.2014    source источник


Ответы (2)


Аннотация @SuppressWarnings может использоваться только в месте объявления. Даже с усовершенствованиями аннотаций Java 8, которые позволяют размещать аннотации в других синтаксических местах, аннотацию @SuppressWarnings нельзя использовать там, где она вам нужна в этом случае, то есть в точке, где устаревший интерфейс встречается в предложении implements.

Вы правы, что не хотите указывать @SuppressWarnings в объявлении класса, поскольку это подавит, возможно, несвязанные предупреждения во всем классе.

Одна из возможностей справиться с этим - создать промежуточный интерфейс, который расширяет устаревший и подавляет предупреждения на нем. Затем измените использование устаревшего интерфейса на подчиненный интерфейс:

@SuppressWarnings("deprecation")
interface SubBaz extends DeprecatedBaz { }

public class Foo ... implements SubBaz ...

Это помогает избежать предупреждений, поскольку аннотации классов (в данном случае @Deprecated) не наследуются.

person Stuart Marks    schedule 01.06.2014
comment
Это отвечает на вопрос, что то, что я пытался сделать, невозможно. - person cclark; 03.06.2014
comment
Решение создания промежуточного интерфейса определенно обходит это, но запутывает код. Мы выбираем широкую область видимости для этого единственного класса, в котором у нас есть проблема. - person cclark; 03.06.2014
comment
@cclark Да, добавление дополнительного интерфейса - это явно обходной путь, а не решение, и добавление дополнительного уровня определенно имеет компромиссы. В вашем случае, если рассматриваемый класс скоро будет удален - да, верно :-) - подавление предупреждений об устаревании для всего класса кажется вполне разумным подходом. - person Stuart Marks; 03.06.2014

Цель аннотации @Deprecated - вызвать предупреждение.

Если вы не хотите вызывать предупреждение, не используйте аннотацию.

person user207421    schedule 23.05.2014
comment
Интерфейс @Deprecated находится в структуре, которую я использую, а не в моем коде. Так что у меня нет контроля над этим, и поэтому мне нужно подавить предупреждение. Я обновил вопрос, чтобы отразить, что это не вариант. - person cclark; 24.05.2014