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

2024-02-28

我正在研究 Java 中的遗留 APICollection Framework我了解到诸如此类的课程Vector and HashTable已被取代ArrayList and HashMap.

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


来自 Sun 官方术语表:

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

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

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

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

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

参考

  • java.sun.com 术语表 http://java.sun.com/docs/glossary.html
  • 语言指南/如何以及何时弃用 API http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
  • 注释类型 已弃用的 API http://java.sun.com/javase/6/docs/api/java/lang/Deprecated.html

请注意,官方术语表没有定义“遗留”的含义。很可能,它可能是乔什·布洛赫(Josh Bloch)使用的一个术语,但没有确切的定义。然而,这意味着永远不应该在新代码中使用遗留类,并且存在更好的替换。

也许使用遗留但未弃用的类的旧代码不需要采取任何操作,因为至少现在,它们不会面临在未来版本中不再存在的危险。

相反,弃用明确警告它们可能不复存在,因此应采取行动迁移到替代品。


引自《Effective Java》第二版

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

第 7 项:避免终结器:唯一声称保证最终确定的方法是System.runFinalizersOnExit和它邪恶的双胞胎Runtime.runFinalizersOnExit。这些方法存在致命缺陷,已被弃用。

第 66 项:同步对共享可变数据的访问: 图书馆提供Thread.stop方法,但这个方法很久以前就被弃用了,因为它本质上是unsafe-- 它的使用可能会导致数据损坏。

第 70 项:记录线程安全: The System.runFinalizersOnExit该方法是线程敌对的,已被弃用。

第 73 项:避免线程组:它们允许您应用某些Thread一次将原语转换为一堆线程。其中一些原语已被弃用,其余的则很少使用。 [...] 线程组已过时。

相比之下,这些是单词所在的引号"legacy"出现:

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

第 25 项:优先使用列表而不是数组:擦除允许泛型类型与不使用泛型的遗留代码自由地互操作。

第 29 项:考虑类型安全的异构容器:这些包装器对于跟踪谁将错误类型的元素添加到混合通用和遗留代码的应用程序中的集合非常有用。

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

第 69 项:优先选择并发实用程序来等待和通知:虽然您应该始终优先使用并发实用程序wait and notify,您可能必须维护使用的遗留代码wait and notify.

这些引用没有经过仔细选择:它们都是该词的实例“已弃用” and "legacy"出现在书中。布洛赫的信息在这里很明确:

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

我自己的主观看法

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

已弃用的 API 和旧版 API 之间的区别? 的相关文章

  • Spring 框架 application.properties 与 logback.xml

    我正在使用 Spring 和 Spring boot 最近 在尝试使用 EhCache 时 我尝试为 EhCache 启用日志记录 在 application properties 中设置日志级别 logging level org spr
  • ClientRequestFactory RestEasy 已弃用...还有其他 RestEasy 替代方案吗?

    我需要使用其他人创建的 RestService 的接口来创建轻松的客户端 这工作很好 除了一件事 当我从rest easy 2 3 5 Final更新到resteasy 3 0 x时 Client RequestFactory类看起来像 D
  • 为什么 Java 中需要 String[] args?

    我知道 String args 是作为参数传递到 main 的字符串数组 java Print Hello World class Print public static void main String args System out p
  • log4j:ERROR 在 tomcat 7 中部署 war 时无法创建自定义 Appender

    我的 log4j xml 中有以下标签
  • 规范路径和绝对路径有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 getPath getAbsolutePath 和 getCanonicalPath 有什么区别 https stackoverflow com questions 1099300 w
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建
  • 在java中迭代日期

    我需要遍历一系列日期 不确定如何在 for 循环中获取第二天 我在用java util Date So plusDays 1 不能在 for 循环中用于获取下一个日期 Used date1 new Date date1 getTime 10
  • 为什么在java中加载JNI是在静态初始化程序中完成的?

    在许多使用 JNI 的示例中 我看到类似以下内容 class SampleClass static System loadLibrary somelib 这种特殊语法的目的是什么 为什么使用这个 而不仅仅是在类构造函数或类似的东西中 我想你
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • Java Swing 组件的命名约定(前缀)

    在 Java 中使用 Swing 进行编程时 我想到的一个问题是 它是 Swing 组件的推荐还是 官方 最常用的命名约定 前缀 例如 尽管其他人可能更喜欢其他命名约定 但这就是我当前正在使用的 JTextField 的 txt JButt
  • Java JDT 解析器。获取VariableDeclarationFragment的变量类型

    我一直在用 JDT 实现 Java 解析器 但我不知道当变量的节点类型为变量声明片段 我只有在涉及到时才发现如何获取变量类型变量声明 我的代码如下 public boolean visit VariableDeclarationFragme
  • Eclipse:对 Java 1.7 的失望(未绑定库)

    我在全新安装的 Eclipse 中处理全新项目时遇到问题 重现步骤 下载此版本的 Eclipse http www eclipse org downloads packages eclipse ide java developers hel
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • 如何使用二叉树中的递归来完成回溯

    我正在尝试插入一个二进制节点 我的代码很复杂 没有希望挽救它 所以我计划重写它 基本上我没有考虑回溯 也没有仔细考虑算法 我正在尝试使用顺序遍历插入二进制节点 但我不明白应该如何回溯 D B E A C F 我如何搜索根 D 的左子树 然后
  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • 术语“可序列化”是什么意思? [复制]

    这个问题在这里已经有答案了 不太确定我读过的定义可序列化实际上做了什么 import java io Serializable import java text StringCharacterIterator import java uti
  • 如何为信号量中等待的线程提供优先级?

    我使用信号量来限制访问函数的线程数量 我希望接下来要唤醒的线程应该由我将给出的某个优先级选择 而不是默认信号量唤醒它们的方式 我们怎样才能做到这一点 这是实现 class MyMathUtil2 implements Runnable do
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对
  • 获取给定字符串日期中该月的最后一天

    我的输入字符串日期如下 String date 1 13 2012 我得到的月份如下 SimpleDateFormat dateFormat new SimpleDateFormat MM dd yyyy Date convertedDat
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise

随机推荐

  • 如何从函数返回数组?

    如何从方法返回数组 以及必须如何声明它 int test void int test 但使用向量会 更C std vector lt int gt test EDIT我会澄清一些问题 既然你提到了C 我就选择new and delete 运
  • 多处理池示例不起作用并冻结内核

    我正在尝试并行化脚本 但由于未知原因 内核只是冻结而没有抛出任何错误 最小工作示例 from multiprocessing import Pool def f x return x x p Pool 6 print p map f ran
  • 似乎没有为 __doPostBack 发出正确的 GridView 标记

    I asked 这个问题 https stackoverflow com questions 4852474 asp net gridview update button fires edit event handler关于 ASP Net
  • 存储 mysql_connect 的 php 值的最安全位置?

    存储将在 mysql connect 中使用的值的最安全位置是什么 调用这些变量的最安全方法是什么 使用 require include 或其他东西会更好吗 谢谢 IMO 存储它的最佳位置是 PHP 文件 无论您使用require or i
  • 为什么 Response.Redirect 会导致 System.Threading.ThreadAbortException?

    当我使用 Response Redirect 将表单重定向到新页面时 出现错误 mscorlib dll 中发生了 System Threading ThreadAbortException 类型的第一次机会异常mscorlib dll 中
  • mgo - 查询性能似乎一直很慢(500-650 毫秒)

    我的数据层大量使用 Mongo 聚合 平均而言 查询需要 500 650 毫秒才能返回 我在用mgo 下面显示了一个示例查询函数 它代表了我的大多数查询的样子 func r userRepo GetUserByID id string Us
  • Picasso vs Imageloader vs Fresco vs Glide vs Coil [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 发现 之间的区别Picasso 与 ImageLoader 在这里 https stackoverflow com q 19995007 108
  • 可以在不等待进程完成的情况下调用 subprocess.call 吗?

    我当前正在使用 subprocess call 来调用另一个程序 但它会阻塞执行线程 直到该程序完成 有没有一种方法可以简单地启动该程序而不等待返回 Use subprocess Popen代替subprocess call process
  • 我需要分割每两个 li 并将它们附加到 div

    我有一个通用列表 ul li list item1 li li list item2 li li list item3 li li list item4 li li list item5 li li list item6 li ul 但我想
  • Docker 出现 cmake 错误:ForceToRelativePath 失败

    我一直在尝试使用cmake在docker中编译一个项目 但是 我收到以下错误 cmake build cmake pCygIN cmake 3 13 4 Source cmOutputConverter cxx 125 static std
  • 带有 animate.css 的猫头鹰轮播标题

    我正在尝试在猫头鹰轮播中制作字幕 我正在使用 animate css 我已在轮播中的字幕中添加了动画 但它并不适用于所有人 只有第一张幻灯片的标题有动画 这是我的代码 div class owl carousel owl theme div
  • NSIncation 和 block 有什么区别?

    当我说阻止时 我的意思是 int a return a a 另外 block仅支持iOS4及以上版本 这两者有什么区别 An NSInvocation是一条发送给对象的消息 使用选择器 带有可选参数 可以稍后 或现在 执行 并且在当前上下文
  • 更改 Nestjs 中的 dist 目录

    我正在构建一个基于 Nestjs 的 API 这main ts文件嵌套在 my 的子文件夹中src目录 结果 编译后的文件也嵌套在dist目录和我的入口点是dist api main js代替dist main js 我希望保持这种状态 当
  • 强制 SHBrowseForFolder() 显示所需的目录

    我已经在网上搜索并与这件事斗争了一个多小时 但似乎仍然无法让它发挥作用 大多数人在论坛等上看到这里时似乎很满意 但我的仍然不起作用 我试图强制 SHBrowseForFolder 函数在我选择的文件夹中启动 char current MAX
  • 强制另存为,MS Excel VBA

    我对 MS Office 产品中的 VBA 有点陌生 我一直在寻找一些代码 这些代码将强制用户 另存为 我用作模板的 xls 文件 但它不是实际的模板文件类型 基本上 我有这个 用户打开 xls 在某个字段中输入一些数据 然后文件 gt 另
  • 具有动态参数的表达式树

    我想转换这个 Func
  • 在 try catch 中访问变量

    我在返回 menuFont 行上不断收到编译错误 它表示没有变量 menuFont 有人可以告诉我如何解决这个问题吗 import java awt Font import java awt FontFormatException impo
  • 发送电子邮件的代码

    我在这里做错了什么 private void SendMail string from string body string mailServerName plus pop mail yahoo com MailMessage messag
  • 删除字符串中的空格

    我必须摆脱超过 1 个空格也就是说 如果有超过 1 个空格 我会将其替换为单个空格 这就是我的做法 但我真的很困惑哪种方法是最好的方法以及所有这些方法有什么区别 下面是我的代码 public class SspaceDemo public
  • 已弃用的 API 和旧版 API 之间的区别?

    我正在研究 Java 中的遗留 APICollection Framework我了解到诸如此类的课程Vector and HashTable已被取代ArrayList and HashMap 然而 它们仍然没有被弃用 并且被视为遗留 本质上