对于Java编程,使用@Deprecated符号和接口方法有什么好处,而不是实现它的类?
public interface Joe {
@Deprecated
public void doSomething();
...
}
public final class Joseph implements Joe {
public void doSomething() {
...
}
...
}
答案 0 :(得分:11)
@Deprecated是文档。如果人们对接口进行编码,则可以将该接口的某些方面标记为已弃用。这样人们就知道不要使用它了。
接口的实现类是一个细节。该类中的方法恰好满足接口,但可能不会自行弃用。弃用该方法可能适合也可能不适合。
创建一个实现接口的新类意味着您需要实现已弃用的方法。除非您知道该类的客户端不使用已弃用的方法,否则它们应该可以工作。例如,如果要创建HTTP servlet容器,则需要实现HttpServletResponse.encodeUrl()
方法,即使它已被弃用而不是encodeURL()
。这是因为您班级的用户可能会调用该弃用的方法。
答案 1 :(得分:8)
我认为这是Java语言本身的一个缺点,将接口中的方法指定为通过注释弃用并且在实现类中不考虑弃用该方法是无稽之谈。
如果继承该方法的@ deprecated-ness会更好。不幸的是,Java似乎不支持这一点。
考虑工具(如IDE)如何处理这种情况:如果将变量的类型声明为接口,则可以使用删除渲染@deprecated方法。但是,如果变量的类型被声明为实现类,并且类签名不包含@deprecated,则该方法将在没有通过的情况下呈现。
基本问题是:对于在接口中而不是在实现类(或扩展接口)中弃用的方法,它意味着什么?唯一合理的意图是在类层次结构中接口以下的所有内容都弃用该方法。但是这种语言并不支持这种行为。
答案 2 :(得分:6)
在我看来它是有争议的:一个不推荐使用的方法界面,不论其实现情况如何都不应该使用(如果没有,请提供反例)
答案 3 :(得分:0)
如果我们想在接口和实现中使用不适当的方法重构现有代码,那么我们可以在接口方法中使用@Deprecated
,以便在几个版本中暂时使用干净的新方法。它可能很丑,只是为了保持代码向后兼容我们可以利用它。这将在IDE和SONAR报告中显示其已弃用的方法并强制客户端使用新方法。