已弃用和旧版API之间的区别?
我正在研究Java Collection Framework
的遗留API,并且我了解到像Vector
和HashTable
这样的类已经被ArrayList
和HashMap
所取代。
但是,它们不会被弃用,并且在被弃用且应该避免的软件功能被应用时,将其视为遗留,因此,我不确定API什么时候被视为遗留以及何时弃用。
从官方的Sun词汇表:
弃用 :指不再推荐的类,接口,构造函数,方法或字段,并可能在将来的版本中停止存在。
从何时开始弃用指南:
你可能听说过这个词,“自我贬低的幽默”,或幽默,使演讲者的重要性降到最低。 不赞成的类或方法就是这样。 它不再重要。 事实上,这是不重要的,你不应该再使用它,因为它已被取代,并可能在未来停止存在。
@Deprecated
注释更进一步,并警告有危险:
注释@Deprecated
的程序元素是程序员不鼓励使用的程序元素,通常是因为它很危险,或者因为存在更好的选择。
参考
请注意,官方词汇表并未定义“遗产”的含义。 很有可能,这可能是Josh Bloch在没有确切定义的情况下使用的术语。 然而,这意味着永远不应该在新代码中使用遗留类,并且存在更好的替换。
也许一个使用传统但未弃用的类的旧代码不需要采取行动,因为至少现在它们在将来的版本中不会有停止存在的危险。
相反,弃用明确警告说它们可能不复存在,因此应采取行动迁移到替代品。
来自Effective Java 2nd Edition的引文
为了比较在上下文中如何使用这些术语,这些是来自书中引用“已弃用”一词的引语:
第7项:避免终结器 :声称保证终止的唯一方法是System.runFinalizersOnExit
及其邪恶的双Runtime.runFinalizersOnExit
。 这些方法是致命的缺陷,并已被弃用。
第66项:同步对共享可变数据的访问 :这些库提供了Thread.stop
方法,但此方法很久以前不推荐使用,因为它本质上是不安全的 - 它的使用会导致数据损坏。
项目70:文档线程安全 : System.runFinalizersOnExit
方法是线程敌对的,并且已被弃用。
项目73:避免线程组 :它们允许您一次性将特定的Thread
原语应用于一组线程。 其中几个基元已被弃用,而其余的基元很少被使用。 线程组已经过时。
相反,这些是引用“遗产”一词的引语:
第23项:不要在新代码中使用原始类型 :它们是为了与引入泛型之前的传统代码的兼容性和互操作性而提供的。
项目25:首选列表到数组 :擦除是允许泛型与不使用泛型的遗留代码自由互操作的东西。
第29项:考虑类型安全的异构容器 :这些包装对于追踪谁在将混合通用代码和传统代码混合在一起的应用程序中将错误类型的元素添加到集合中很有用。
第54项:明智地使用本地方法 :它们提供对遗留代码库的访问,从而可以访问遗留数据。 [...]使用本地方法访问遗留代码也是合法的。 [...]如果您必须使用本地方法来访问底层资源或旧式库,请尽可能使用原生代码并进行彻底测试。
项目69:首选并发实用程序来等待和通知 :虽然您应该始终优先使用并发实用程序来wait
并notify
,但您可能必须维护使用wait
和notify
旧代码。
这些引号并未经过精心挑选:它们是书中出现“已弃用”和“遗留”一词的所有实例。 布洛赫的信息在这里很明显:
Thread.stop
是危险的,绝对不应该使用。 wait/notify
可以保留在遗留代码中,但不应该用于新代码中。 我自己的主观意见
我的解释是,贬低某些东西承认这是一个错误,而且从一开始就不好。 另一方面,将某件事物归类为遗产承认它在过去已经足够好,但它已经达到了它的目的,并且不再适合现在和未来。
一个常见的解释是,弃用意味着它将在不久的将来被删除,Legacy意味着它将保持向后兼容或其他原因。
两者都意味着它们不应该被新代码使用。
在JDK的情况下,即使弃用代码也会保留,因为向后兼容性对Java JDK非常重要。
弃用通常意味着有意在未来的某个时候删除功能,而遗留仅仅意味着如果可能的话不应该在新代码中使用它(尽管可能需要互操作的原因)。
链接地址: http://www.djcxy.com/p/13273.html