java类库的废弃API

java语言一直在进化,java类库也越来越庞大,给人的感觉是一直在做加法。

有没有做减法呢?当然也有,一些是设计失误需要撤回的,如可能引起线程安全问题的Thread.stop()等方法;还有是随着时代发展而被淘汰的,比如曾被寄予厚望的Applet。

java类库中这些废弃的内容有没有地方统一归档,方便我们的查找?假如我们要升级java版本,而找出当前代码中使用了哪些新版本废弃的API,就能让准备更加充分。

答案是有的。

java9之后的java API文档,贴心地单独为废弃的内容做了一个页面。如java 21版本对应的链接是 Deprecated List (Java SE 21 & JDK 21)。

顶上有个过滤功能,可以按特定版本来分别过滤该版本废弃了哪些,其中的others选项包含了11之前所有版本的废弃内容。

接下来是目录,根据类型分为接口、(非异常)类、异常类、字段、方法、常量、枚举常量这七种。而最上面的终将废弃( Terminally Deprecated),和下面的七种并不是并列关系,而是将下面七种类型中最终会被删除的部分提取(复制)出来,单独放在这里。

为什么这样做?因为废弃的含义分为两种,一种是后续版本要删除的(即终将废弃),如果你的代码使用了这样的API,如果后续升级类库,你的代码就可能无法通过编译。而另一种是不会删除的API,但不建议你使用,后续版本也会保留,升级类库不会编译失败。作为类库的用户,显然更关注第一种,所以就单独放了一份。(更多可参考 JEP 277: Enhanced Deprecation)

接下来就是具体的内容,分别是名称、版本号和描述,并支持按名称或版本号进行排序。按版本号排序很实用,描述的内容也值得参考,里面会提供废弃的原因,是否有替代品等信息。

简单地浏览一部分:

终将废弃并删除的

java.lang.Thread.stop() 等

还有resume、suspend 以及 ThreadGroup类对应的方法。早在1.2就废弃了。

参考 Java Thread Primitive Deprecation (Java SE 21 & JDK 21) (oracle.com)icon-default.png?t=N7T8https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html

java.applet.Applet等

java9废弃,早就没人用了

java.lang.Boolean(boolean) 等构造函数

还有Byte、Character、Double等基本类型的包装类,它们的构造函数都在java 9废弃了。改用静态工厂方法,可以参考 Effective Java 的第一条建议。

java.lang.Object.finalize()

一直没存在感的方法终于在java 9 废弃了,减少了记忆学习的负担。虽然这里建议改用 Cleaner,但 Effective Java 3 第八条告诉我们,Cleaner最好也别去碰。

javax.security.cert.Certificate 等

其实是转正了,包名从 javax... 换成了 java.security.cert 。可见网络安全的地位从可选变成了必选。java 9 废弃。

java.lang.SecurityManager 及其相关

java 17废弃。这安全也是当年java的一大卖点,现在也没落了。

这个的确很少用,页面中给出了废弃原因的链接: JEP 411。

主要就是说,一是用于客户端代码安全,但Servlet早就没人用了;二是用于服务端代码安全,可实际上基本没什么人用。

java类库越来越大,要管的东西太多,我们维护起来太累,放弃了。

另外2020年CWE的top 25安全漏洞,Security Manager有19个都管不了,还要它干嘛?(感觉这个有点强词夺理,也没指望人一个机制能解决所有层面上的漏洞)

发明了20多年,但业界太少人用了,除了少量软件如ElasticSearch和Tomcat。

甚至.NET都不支持了,java废弃它的理由就更充分啦。

废弃但不删除的

java.util.Observer 接口 和 java.util.Observable 类

java9 废弃,理由是功能太局限。

如果要更丰富的事件模型,用 java.beans包。如果要可靠有序,用 java.util.concurrent 包。如果要用响应式流风格编程,用 Flow API。

java.util.Date.getDate() 等方法

从1.1版本起就废弃了。

废弃的有 get/set 年月日时分秒等方法,以及转换成字符串的方法。废弃的原因是这些api不支持国际化。所以要获取年月日等信息,要用Calendar类;而格式化或者日期解析,要用 DateFormat类。

Date类本身剩下的非废弃方法就两三个,只能用于比大小,功能非常有限,感觉类似于废弃。构造函数只剩两个,一个是无参,根据当前时间构造对象,另一个是long毫秒数为参数。还有个java 8加入的静态工厂方法,根据Instant对象生成Date对象。

java.lang.Class.newInstance() 方法

java 9废弃。这个方法用来调用某个类的无参构造器,如果构造器有异常,则newInstance方法会原样抛出来。但newInstance方法本身只声明了两个 checked 异常:InstantiationException 和 IllegalAccessException。这个和java语言规定的“方法必须声明所有自己可能抛出的checked异常”就矛盾了,等于绕过了编译器的校验。

建议改用 Constructor.newInstance  方法,它会把构造器的异常包装成 InvocationTargetException 抛出来,而且也在方法中声明了。

java.lang.Runtime.exec(String)等方法

java 18废弃。并不是所有exec都废弃了,只是废弃了其中几个容易出问题的:

java.lang.Thread.getId()

java19废弃。因为它不是final,可能被覆写。现在加final又太迟了。建议改用 Thread.threadId()。

java.util.Locale的构造器

所有构造器全部在java 19废弃了。替代方式有很多,比如 Local.Builder,还有两个静态工厂方法,或者常量,以及匹配/过滤/查找等方法。

java.net.URL的构造器

所有构造器全部在java 20废弃了。改用URI或URL的一些静态工厂方法。

补充

jdeprscan

相比看文档,想知道当前项目里用了哪些废弃的java类库API,更精确的方法是使用 jdeprscan ,具体可以参见 The jdeprscan Command (oracle.com)

javadoc

新版本的javadoc也支持生成“废弃”页面。比如写这样一个类:

/** @deprecated useless class */
@Deprecated(since="11", forRemoval=true)
public class Hello {

    /** @deprecated useless method */
    @Deprecated(since="9", forRemoval=true)
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getId());
    }
}

然后执行 

javadoc Hello.java

打开生成的api文档,可以看到

不过相比Oracle提供的文档,我们的文档少了两部分,一是顶部按版本过滤的复选框,二是表格中的版本列。也许是Orcale做了定制,还需要再研究下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210101.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《微信小程序开发从入门到实战》学习三十八

4.2 云开发JSON数据库 4.2.9 条件查询与查询指令 在查询数据时,有时需要对查找的数据添加一些限定条件,只获取满足给定条件的数据,这样的查询称为条件查询。 可以在集合引用上使用where方法指定查询条件,再用get方法&#xff0…

springCache——jetcache缓存

文章目录 jetcache远程、本地缓存方案jetcache方法注解使用方式 jetcache远程、本地缓存方案 <dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.6.4</version></de…

SpringBootCache缓存——j2cache

文章目录 缓存供应商变更&#xff1a;j2cache 缓存供应商变更&#xff1a;j2cache <!-- https://mvnrepository.com/artifact/net.oschina.j2cache/j2cache-core --><dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-cor…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了&#xff0c;装一下linux系统玩一下。 使用工具如下&#xff1a;一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…

定时任务特辑 | Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比,和Spring Boot集成实战

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

提升Jmeter测试效率的9种参数化方法!

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

探索未来能源:可控核聚变的挑战与希望

探索未来能源:可控核聚变的挑战与希望 引言 随着人类社会的不断发展,对能源的需求也在持续增长。传统的化石燃料能源在燃烧过程中会产生大量的二氧化碳和其他温室气体,导致全球气候变暖,对环境产生了重大威胁。因此,寻找一种清洁、可持续、高效的能源成为了当务之急。在…

linux学习资源

linux书籍资源&#xff08;pdf版&#xff09;&#xff1a; 有需要的请在评论区留言。 《Linux Basics for Hackers》 kaiwan的三部曲&#xff1a; 《Hands-On System Programming with Linux》 《Linux Kernel Programming》 《Linux Kernel Programming Part 2》 《Ma…

C#中GDI+图形图像绘制(直线、矩形、圆、椭圆、圆弧、扇形、多边形)

目录 一、直线 二、矩形 三、椭圆 四、圆 五、圆弧 六、扇形 七、多边形 八、示例源码 一、直线 调用Graphics类中的DrawLine()方法&#xff0c;结合Pen对象可以绘制直线。DrawLine()方法有以下两种构造函数。 第一种用于绘制一条连接两个Point结构的线。当参数pt1的值…

你的身份信息是否被冒用,办了电话卡却毫不知情?

近日&#xff0c;公安部发布电信网络诈骗及其关联违法犯罪联合惩戒办法&#xff0c;向社会公开征求意见。 在征求意见稿中&#xff0c;非法买卖、出租、出借电话卡三张以上&#xff0c;假冒他人身份或者虚构代理关系开立电话卡等行为被列入惩戒。 为了防止自身利益受到侵害&a…

Chrome 拓展开发系列:什么是 Chrome 拓展?

文章目录 Chrome 拓展&#xff08;Chrome Extension&#xff09;是什么为什么使用 Chrome 拓展&#xff1f;个性化浏览体验提高工作效率改善隐私和安全创新新功能 发展历史2009 年&#xff1a;初版发布2010 年&#xff1a;稳步增长2013 年&#xff1a;Chrome App 和扩展合并201…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层&#xff1f;四层&#xff1f; 1.为什么需要协议&#xff1f;2.OSI七层模型是干什么的&#xff1f;3.TCP/IP四层&#xff08;参考&#xff09;模型4.TCP/IP&#xff08;参考&#xff09;模型与OSI七层模型有什么异同&#xff1f; 二、自底向上的网络分层 1. 物理层2…

6.7 Windows驱动开发:内核枚举LoadImage映像回调

在笔者之前的文章《内核特征码搜索函数封装》中我们封装实现了特征码定位功能&#xff0c;本章将继续使用该功能&#xff0c;本次我们需要枚举内核LoadImage映像回调&#xff0c;在Win64环境下我们可以设置一个LoadImage映像加载通告回调&#xff0c;当有新驱动或者DLL被加载时…

光伏测算工具能测量哪些数据?

光伏测算工具在光伏电站的设计和规划过程中起着至关重要的作用。它们可以测量并分析一系列关键数据&#xff0c;以确保光伏电站的顺利建设和高效运营。本文将详细介绍光伏测算工具能测量的主要数据。 一、太阳能资源评估 光伏测算工具可以对场地的太阳能资源进行评估。这包括测…

C++模版

文章目录 C模版1、泛型编程2、函数模版2.1、函数模版概念2.2、函数模版格式2.3、函数模版原理2.4、函数模版的实例化2.5、模板参数的匹配原则 3、类模版3.1、类模版概念3.2、类模版格式3.3、类模板的实例化 C模版 1、泛型编程 泛型编程&#xff08;Generic Programming&#x…

html个人简历网页版源码

文章目录 1.个人简历1.1 简历风格1 - 纯净版1.2 简历风格2 - 蓝色版1.2 简历风格3 - 粉色心动版 源码目录结构源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134752070 html个人简历网页版源码&#xff0c;好看…

SpringBoot整合JavaMail

SpringBoot整合JavaMail发一个简单邮件 文章目录 SpringBoot整合JavaMail发一个简单邮件导入坐标配置写客户端 SpringBoot整合JavaMail发多部件邮件 导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…

SEO插件,免费的SEO插件大全

SEO插件的作用 让我们来谈谈SEO插件的作用。SEO插件是一种能够在网站建设和管理过程中&#xff0c;提供全方位、智能化SEO服务的工具。它们通常嵌入在网站后台&#xff0c;为站长提供了诸如关键词优化、页面结构调整、外链管理等一系列强大功能&#xff0c;帮助站长更好地适应…

【数电笔记】最小项(逻辑函数的表示方法及其转换)

目录 说明&#xff1a; 逻辑函数的建立 1. 分析逻辑问题&#xff0c;建立逻辑函数的真值表 2. 根据真值表写出逻辑式 3. 画逻辑图 逻辑函数的表示 1. 逻辑表达式的常见表示形式与转换 2. 逻辑函数的标准表达式 &#xff08;1&#xff09;最小项的定义 &#xff08;2&am…