当前位置: 首页 > 面试题库 >

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

薛宇
2023-03-14
问题内容

我正在研究Java中的旧版API,Collection Framework并了解到诸如和Vector和的类HashTable已被ArrayList和取代HashMap

但是,仍旧不建议弃用它们,并且从本质上讲,弃用应用于已被取代且应避免的软件功能,因此,我不确定何时何时弃用API。


问题答案:

从Sun官方词汇表中:

弃用 :指不再推荐的类,接口,构造函数,方法或字段,并且在以后的版本中可能不再存在。

从何时弃用指南:

您可能已经听说过“自嘲的幽默”一词,或使演讲者的重要性降至最低的幽默。弃用的类或方法就是这样。它不再重要。实际上,它是如此不重要,以致您不再应该使用它,因为它已被取代,并且将来可能不再存在。

@Deprecated注释进一步进了一步和危险警告:

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

参考文献

  • java.sun.com词汇表
  • 语言指南/如何以及何时弃用API
  • 注释类型弃用的API

请注意,官方词汇表并未定义“传统”的含义。很有可能是乔什·布洛赫(Josh
Bloch)使用的一个术语,没有确切的定义。但是,这意味着总是不要在新代码中使用遗留类,并且存在更好的替代方法。

也许使用旧版但未弃用的类的旧代码不需要任何操作,因为至少到目前为止,它们没有停止存在于未来版本中的危险。

相反,弃用则明确警告它们可能不再存在,因此应采取措施迁移到替代产品。

有效Java 2nd Edition的报价

为了比较这些术语在上下文中的使用方式,以下是这些书中引用 “不赞成使用” 一词的引文:

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

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

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

项目73:避免线程组 :它们使您可以一次将某些Thread原语应用于一堆线程。这些原语中有几个已被弃用,其余的则很少使用。线程组已过时。

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

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

第25项:更喜欢使用数组列表 :擦除是使泛型类型与不使用泛型的旧代码自由互操作的原因。

第29项:考虑类型安全的异构容器 :这些包装器对于跟踪谁在混合通用代码和旧代码的应用程序中向集合中添加了错误类型的元素的人很有用。

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

项目69:建议并发实用程序等待并通知
:虽然您应该始终优先使用并发实用程序,而不是waitnotify,但是您可能必须维护使用wait和的旧代码notify

这些引号不是经过精心选择的:它们都是在书中出现 “已弃用”“旧版” 一词的所有实例。Bloch的信息在这里很清楚:

  • 不推荐使用的方法(例如Thread.stop)是危险的, 绝对 不要使用。
  • 另一方面,例如wait/notify可以保留在旧代码中,但不应在新代码中使用。

我自己的主观意见

我的解释是,弃用某些东西就承认这是一个错误,从一开始就没有好处。另一方面,将某事物分类为遗留物就意味着该事物在过去已经足够了,但已经达到了目的,并且对于现在和将来都不再足够。



 类似资料:
  • 本文向大家介绍REST API和SOAP API之间的区别,包括了REST API和SOAP API之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道,每台机器都以不同的语言或输入来理解和交易,因此Web服务是机器之间进行相互通信并在它们之间交换数据所必需的。为了对其通信实施一些限制,定义了一些规则和规定,称为网络服务,它们基本上定义了需要交换的数据的格式和类型,尤其是两台机器都应注意的

  • 在Java最近几个主要版本的每一次迭代中,似乎都有管理并发任务的新方法。 在Java9中,我们有Flow API,它类似于RxJava的Flowable API,但在Java9中,它有一组简单得多的类和接口。 Java 9 具有类似流API的类的完整包,即、、、,它们似乎做了类似的事情。 这两个库的主要区别是什么?为什么有人会使用Java9Flow库而不是更多样化的RxJava库,或者反之亦然?

  • 问题内容: 在最近几个主要版本的Java的每次迭代中,似乎都有一致的新方法来管理并发任务。 在Java中9,我们有流API这类似于可流动API RxJava,但与Java 9有一个更简单的一组类和接口。 Java 9 有,,,,和,这就是它。 RxJava的 拥有全 包 的流API状类,即,,,,和这似乎做同样的事情。 这两个库之间的主要区别是什么?为什么有人会使用Java 9 Flow库而不是种

  • 问题内容: 我可以使用一些指导,说明何时值得使用Joda Time而不是基本的java.util.Date类。有什么好处?Joda Time是让您做Date类无法做的事情,还是使用起来更容易? 另外,我已经看到有关Joda Time是否属于标准API的冲突信息。是否标准? 问题答案: Java的标准日期和时间类(主要是和)具有有限的功能,并且存在许多设计问题。不赞成使用许多构造函数和方法的事实就是

  • 问题内容: 我是Java EE技术的初学者。我想知道罐子和罐子之间有什么区别。 为什么将API和实现分开?这是否意味着还有其他可用的实现? 问题答案: API和实现是分开的,因为Java EE使用标准化的规范。 API是该规范的一部分,并且包含一组大多数接口,参与创建该规范的每个人都同意该接口。从理论上讲,每个人都可以实现实现已发布的标准化API并按照相关规范文档中所述进行操作的实现。当实现通过所

  • 问题内容: Maven模块和之间有什么区别?是否需要在其中包含两个依赖项? 我需要写两个依赖吗 要么 足够? 我是否需要增加对的依赖? 问题答案: 5.4之前的JUnit 从文档: JUnit Jupiter API,用于编写测试和扩展。 JUnit Jupiter测试引擎实现,仅在运行时需要。 JUnit Vintage测试引擎实现,允许在新的JUnit Platform上运行Vintage J