10

对于 Java 编程,在接口方法上使用 @Deprecated 符号而不是在实现它的类上有什么好处?

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}
4

4 回答 4

11

@Deprecated 是文档。如果人们对某个接口进行编码,您可以将该接口的某些方面标记为已弃用。这样人们就知道不要使用它。

接口的实现类是一个细节。该类中的方法恰好满足接口,但可能不会单独弃用。弃用该方法可能合适,也可能不合适。

创建一个实现接口的新类意味着您需要实现已弃用的方法。除非您知道该类的客户端不使用已弃用的方法,否则它们应该可以工作。例如,如果您正在创建一个 HTTP servlet 容器,您需要实现该HttpServletResponse.encodeUrl()方法,即使它已被encodeURL(). 那是因为您的班级的用户可能会调用该已弃用的方法。

于 2009-08-12T19:04:53.203 回答
9

我认为这是 Java 语言本身的一个缺点,并且通过注释将接口中的方法指定为不推荐使用并且没有在实现类中考虑不推荐使用的方法是无稽之谈。

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

考虑工具(例如 IDE)如何处理这种情况:如果变量的类型被声明为接口,则可以使用删除线呈现 @deprecated 方法。但是如果一个变量的类型被声明为实现类并且类签名不包含@deprecated,那么该方法将被渲染而没有删除线。

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

于 2009-08-12T22:25:23.767 回答
6

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

于 2009-08-12T18:25:15.187 回答
0

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

于 2015-11-12T10:24:50.723 回答