Java 仅在接口上使用@Deprecated符号有什么好处?

Java 仅在接口上使用@Deprecated符号有什么好处?,java,deprecated,Java,Deprecated,对于Java编程来说,在和接口方法上使用@Deprecated表示法而不是在实现它的类上使用@Deprecated表示法有什么好处 public interface Joe { @Deprecated public void doSomething(); ... } public final class Joseph implements Joe { public void doSomething() { ... } ...

对于Java编程来说,在和接口方法上使用@Deprecated表示法而不是在实现它的类上使用@Deprecated表示法有什么好处

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}

在我看来,这是有争议的:不推荐使用的方法接口,无论其实现如何(如果不是,请提供反例)

@不推荐使用的is文档。如果用户对某个接口编写代码,则可以将该接口的某些方面标记为已弃用。这样人们就知道不要使用它

接口的实现类是一个细节。该类中的一个方法恰好满足接口要求,但其本身可能不会被弃用。不推荐该方法可能不合适,也可能不合适


创建实现接口的新类意味着您需要实现不推荐使用的方法。除非您知道类的客户机不使用不推荐的方法,否则它们可能会工作。例如,如果要创建HTTP servlet容器,则需要实现
HttpServletResponse.encodeUrl()
方法,即使该方法不赞成使用
encodeUrl()
。这是因为您的类的用户可能会调用该不推荐的方法。

我认为这是Java语言本身的一个缺点,通过注释将接口中的方法指定为不推荐的,而在实现类中不将该方法视为不推荐的,这是毫无意义的

如果继承该方法的@deprecated属性会更好。不幸的是,Java似乎不支持这一点

考虑工具(如IDE)如何处理这种情况:如果变量的类型被声明为接口,那么@deprecated方法可以通过删除来呈现。但是,如果变量的类型被声明为实现类,并且类签名不包括@deprecated,那么将呈现该方法,而不进行删除


基本问题是:在接口中弃用方法而不是在实现类(或扩展接口)中弃用方法意味着什么?唯一合理的意图是,对于类层次结构中接口下面的所有内容,都不推荐使用该方法。但是该语言不支持这种行为。

如果我们想在接口和实现中使用不合适的方法重构现有代码,那么我们可以在接口方法中使用
@Deprecated
,在少数版本中暂时使用干净的新方法。它可能很难看,只是为了保持代码向后兼容,我们可以利用它。这将在IDE和SONAR报告中显示,这是一种不推荐使用的方法,并迫使客户端使用新方法。

我会更进一步,而不是有争议的方法:我会说这是有问题的。我当然会要求在代码审查中证明它的合理性。为什么不呢?这仅仅意味着多方法接口中的一个方法计划在将来的版本中删除。@Eugene:可能是这样,但示例中只显示了一个方法。那么,如果只有一个方法,为什么还要有这个接口呢lol@Eugene:有时接口用作标记,不包含任何方法,例如Serializable。如果Serializable包含一个现在已弃用的方法,那么它仍然是一个有用的接口,如果Serializable对象希望与任何旧客户端兼容,那么它们仍然应该实现该方法。@dfa,@CPerkins:类应该实现其接口的所有方法,以便与使用它们的客户端兼容;如果Joe接口除了不推荐的方法之外还有其他用途,那么应该实现不推荐的方法。为什么还要贬低接口中的-only-method呢?只要在你的发布文档中写上“不推荐使用接口‘Joe’”之类的话。接口和类还有其他方法。抱歉,扎克弄糊涂了。请继续“不赞成[implementation]方法可能合适,也可能不合适。”具体来说,可能是接口方法doSomething不适合Joe的所有实现,但是对于这个特定的实现是合适的——因此在接口中使用了弃用,但在这个特定的实现中不使用。