What are benefits of using the @Deprecated notation on the interface only?

Asked
Viewd6496

10

For Java programming, what are some benefits of using the @Deprecated notation on and interface method but not on the class that implements it?

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}
  • Why would you even depreciate the -only- method in an interface anyway? Just put in your release docs that “Interface ‘Joe’ is not used recommended to be used.” or something.

    Zack12 августа 2009, 18:46
  • There are other methods to the interface and class. Sorry Zack for the confusion.

    Mookie Wilson12 августа 2009, 18:54

4 ответов

9

I believe it's a shortcoming in the Java Language itself and it is nonsense to specify a method in an interface as deprecated via an annotation and not have the method considered deprecated in the implementing class.

It would be better if the @deprecated-ness of the method were inherited. Unfortunately, it seems Java does not support this.

Consider how tooling, such as an IDE, treats this situation: If the type of a variable is declared to be the interface, then @deprecated methods can be rendered with a strike through. But if the type of a variable is declared to be the implementing class and the class signature does not include @deprecated, then the method will be rendered without a strike through.

The fundamental question is: what does it MEAN for a method to be deprecated in an interface but not in an implementing class (or in an extending interface)? The only reasonable intention is for the method to be deprecated for everything below the interface in the class hierarchy. But the language does not support that behavior.

6

in my opinion it is controversial: a deprecated method interface should not not be used regardless it's implementation (please provide counterexamples if not)

  • @Eugene: That may be true, but the example only showed one method. So, why even have that interface if it only has one method? :/ lol

    Zack12 августа 2009, 18:47
  • @Eugene: Иногда интерфейс используется как маркер и не содержит методов, таких как Serializable. Если бы Serializable содержал метод, который теперь устарел, он по-прежнему был бы полезным интерфейсом, и объекты Serializable должны по-прежнему реализовывать этот метод, если они ожидают совместимости со старыми клиентами.

    Mr. Shiny and New 安宇12 августа 2009, 19:07
  • Почему бы и нет? Это просто означает, что в будущих выпусках планируется удалить один метод в интерфейсе с несколькими методами.

    Eugene Ryzhikov12 августа 2009, 18:43
  • класс должен реализовать все методы, ни в коем случае :)

    dfa12 августа 2009, 19:14
  • I’d go further than controversial: I’d say it’s questionable. I’d certainly ask for it to be justified in a code review.

    CPerkins12 августа 2009, 18:31
  • @dfa I meant implement the method properly, as opposed to a stub that’s a no-op.

    Mr. Shiny and New 安宇19 августа 2009, 19:23
  • @dfa, @CPerkins: A class should implement all the methods of its interfaces for compatibility with the clients that use them; if the Joe interface has any use besides that deprecated method then the deprecated method should be implemented.

    Mr. Shiny and New 安宇12 августа 2009, 19:08
0

Если мы хотим реорганизовать существующий код с использованием неподходящих методов в интерфейсе и в реализации, мы можем использовать @Deprecated в методах интерфейса в пользу чистых новых методов временно для нескольких выпусков. Это может быть некрасиво, просто чтобы сохранить обратную совместимость кода, мы можем его использовать. Это покажет в отчете IDE и SONAR, что это устаревший метод, и клиенты будут вынуждены использовать новые методы.

11

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

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

Создание нового класса, реализующего интерфейс, означает, что вам необходимо реализовать устаревшие методы. Вероятно, они должны работать, если вы не знаете, что клиенты класса не используют устаревшие методы. Например, если вы создаете контейнер HTTP-сервлета, вам необходимо реализовать метод HttpServletResponse.encodeUrl(), даже если он устарел в пользу encodeURL(). Это потому, что пользователь вашего класса может вызвать этот устаревший метод.