2009-08-12 31 views
9

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

public interface Joe { 

    @Deprecated 
    public void doSomething(); 

    ... 
} 

public final class Joseph implements Joe { 

    public void doSomething() { 
     ... 
    } 

    ... 
} 
+0

为什么你甚至会贬低界面中的-only-方法呢?只需在您的发布文档中指出“不推荐使用”Interface“Joe”。“或者其他的东西。 – Zack 2009-08-12 18:46:38

+0

接口和类还有其他方法。对不起Zack的困惑。 – 2009-08-12 18:54:58

回答

8

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

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

请考虑工具(如IDE)如何处理这种情况:如果变量的类型被声明为接口,则可以通过穿透渲染@deprecated方法。但是,如果变量的类型被声明为实现类,并且类签名不包含@deprecated,那么方法将被渲染而没有穿透。

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

6
在我看来

争议弃用的方法接口切忌不能不管使用它的实现(请如果没有提供反例)

+0

我会比有争议的更进一步:我会说这是有问题的。我肯定会要求它在代码审查中是合理的。 – CPerkins 2009-08-12 18:31:50

+1

为什么不呢?这只是意味着多方法接口中的一种方法计划在未来版本中删除。 – 2009-08-12 18:43:08

+0

@Eugene:这可能是对的,但该示例仅显示了一种方法。那么,为什么即使有这个接口,如果它只有一种方法?:/ lol – Zack 2009-08-12 18:47:40

11

@Deprecated是文档。如果人们对界面进行编码,则可以将该界面的某些方面标记为已弃用。这样人们就不会使用它。

接口的实现类是一个细节。该类中的方法恰好满足接口,但不能自行弃用。否定该方法可能适用也可能不适用。

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

+0

扩大“不赞成[实施]方法可能适用也可能不适用。”具体而言,可能是接口方法doSomething不适用于Joe的所有实现,但适用于此特定实现Joseph - 因此在接口中弃用,而不是在此特定实现中。 – drew 2012-08-13 17:49:46

0

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

相关问题