已弃用的 API 和旧版 API 之间的区别?

2022-09-01 07:35:30

我正在研究Java中的遗留API,我了解到诸如 和 之类的类已被 和 所取代。Collection FrameworkVectorHashTableArrayListHashMap

然而,它们仍然没有被弃用,并且被视为遗留,而本质上,弃用应用于被取代并应避免的软件功能,因此,我不确定API何时被视为遗留以及何时被弃用。


答案 1

来自官方的太阳词汇表:

deprecation:指不再推荐的类、接口、构造函数、方法或字段,并且可能在将来的版本中不复存在。

从如何以及何时弃用指南中:

你可能听说过“自嘲幽默”这个词,或者说是贬低说话者重要性的幽默。已弃用的类或方法就是这样。它不再重要。事实上,它是如此不重要,以至于你不应该再使用它,因为它已被取代,将来可能不复存在。

注释更进一步,警告危险:@Deprecated

带注释的程序元素是不鼓励程序员使用的,通常是因为它很危险,或者因为存在更好的替代方案。@Deprecated

引用


请注意,官方词汇表没有定义“遗产”的含义。很有可能,这可能是乔希·布洛赫(Josh Bloch)在没有确切定义的情况下使用的术语。但是,这意味着始终不应该在新代码中使用旧类,并且存在更好的替换。

也许使用遗留但未弃用的类的旧代码不需要任何操作,因为至少就目前而言,它们不会在未来版本中停止存在。

相反,弃用会明确警告它们可能不复存在,因此应采取措施迁移到替换。


引用自《有效 Java 第 2 版》

为了比较这些术语在上下文中的使用方式,这些是书中出现“已弃用”一词的引用:

第7项:避免终结者:声称保证终结的唯一方法是及其邪恶的孪生兄弟。这些方法存在致命缺陷,已被弃用。System.runFinalizersOnExitRuntime.runFinalizersOnExit

项目 66:同步对共享可变数据的访问:库提供了该方法,但此方法很久以前就被弃用了,因为它本质上是不安全的 - 使用它可能会导致数据损坏。Thread.stop

项目 70:文档线程安全:该方法具有线程恶意性,已弃用。System.runFinalizersOnExit

项目 73:避免线程组:它们允许您一次将某些基元应用于一堆线程。其中几个基元已被弃用,其余的则很少使用。[...]线程组已过时。Thread

相比之下,这些是“遗产”一词出现的引号:

第 23 项:不要在新代码中使用原始类型:提供原始类型是为了与引入泛型之前的旧代码兼容和互操作性。

项目 25:优先选择列表而不是数组:擦除允许泛型类型与不使用泛型的旧代码自由互操作。

第 29 项:考虑类型安全的异构容器:这些包装器可用于跟踪谁将错误键入的元素添加到混合了泛型代码和旧代码的应用程序中的集合中。

项目 54:明智地使用本机方法:它们提供对遗留代码库的访问,而遗留代码库又可以提供对遗留数据的访问。[...]使用本机方法访问旧代码也是合法的。[...]如果必须使用本机方法来访问低级资源或旧库,请尽可能少地使用本机代码并对其进行全面测试。

项目 69:首选并发实用程序等待和通知:虽然应始终优先使用 并发实用程序,但您可能必须维护使用 和 的旧代码。waitnotifywaitnotify

这些引文没有经过精心挑选:它们都是“弃用”和“遗产”一词出现在书中的例子。布洛赫的信息在这里很明确:

  • 例如,弃用的方法是危险的,根本不应该使用。Thread.stop
  • 另一方面,例如 可以保留在旧代码中,但不应在新代码中使用。wait/notify

我自己的主观意见

我的解释是,弃用某物就是承认它是一个错误,从一开始就不好。另一方面,将某物归类为遗产是承认它在过去已经足够好了,但它已经达到了目的,对现在和未来来说已经不够好了。


答案 2

一种常见的解释是,Deprecated意味着它将在不久的将来被删除,Legacy意味着它将由于向后兼容性或其他原因而保留。

两者都意味着它们不应该被新代码使用。

对于JDK,甚至不推荐使用的代码也会保留,因为向后兼容性对于Java JDK非常重要。