Java Deprecated API 和 SuppressWarnings“弃用” - 实用方法

2023-11-26

我见过很多例子使用DeprecatedAPI 上的注释以便将它们标记为“需要尽快更换”。

然而,在几乎所有这些情况下,代码开发人员不仅继续使用已弃用的 API,而且还继续使用已弃用的 API。抑制了弃用警告.

API 开发人员的最佳意图似乎最终会创建更多与已实现的业务逻辑无关的代码 - 如果 API 已被弃用,但在相关警告被抑制的情况下继续使用,那么充其量似乎是代码的退化,并且恕我直言,在最坏的情况下替换已弃用的库时可能是一个潜在的应用程序断点。

这个问题有实际的解决办法吗?至少,如果这种情况确实在 CR 中停留了相对较长的时间,那么有一种方法可以将这种情况标记为代码异味吗?

请建议您可能正在使用的实际解决方案(库、SCA、CR 插件等......)

是否有任何计划中的 JRE/JDK 功能可以帮助解决这种情况?我的研究目前还没有发现任何东西。

参考:

  • 在java中注释已弃用的类的最佳方法是什么
  • 使用已弃用的 api 是否错误
  • 使用 @SuppressWarnings 排除警告
  • 使用 @Deprecated Java 类而不产生编译警告

第 1 步:宣布删除

人们可能认为弃用 API 意味着宣布它将被删除,但这并不是唯一的用例(如相关文章中所述,例如Java 7 and Java 9):

  • 该 API 是危险的(例如,Thread.stop方法)。

  • 有一个简单的重命名(例如,AWTComponent.show/hide取而代之setVisible).

  • 可以使用更新、更好的 API 来代替。

  • 已弃用的 API 将被删除。

更复杂的是,在 Java 9 之前,JDK 中没有删除任何已弃用的 API(请参阅Java 弃用 20 年),因此如果开发人员不认真对待弃用(无论是在 JDK 还是其他地方),这是可以理解的。

因此,您需要清楚地传达 API真的真的会被移除。执行此操作的方法取决于编译 API 所使用的 Java 版本。

Java 8 或更低版本

在这些 Java 版本中,没有正式的方法来明确区分各种弃用用例。您能做的最好的事情就是添加 Javadoc 标签@deprecated不仅给出弃用的原因并列出替代方案,还明确宣布您打算删除该 API。

Java 9 或更高版本

从 Java 9 开始,增强弃用,你现在可以写

@Deprecated(forRemoval=<boolean>)

明确记录您的意图。我认为与 Javadoc 一起@deprecated(其中应详细说明弃用的原因并列出替代方案),这个标准化标志是一个公平的警告。

将此标志设置为true,编译器将针对每次使用已弃用的元素发出警告,如下所示:

YourClass.java:<line>: warning: [removal] <method> in <class> has been
deprecated and marked for removal

默认情况下启用此警告(而不必使用-Xlint:deprecation) 并且是not抑制与@SuppressWarnings("deprecation")。相反,人们必须用新的方法来抑制它@SuppressWarnings("removal"),这可能会让开发人员在没有充分理由的情况下三思而后行。

此外,您可以明确声明引入弃用的库版本

@Deprecated(since="<version>")

在 Javadoc 或源代码中查看这一点可以帮助开发人员评估更新代码的紧迫性。

步骤 2a:运行时警告

如果这种情况可行,请添加运行时提醒:当使用已弃用的 API 时,让它在控制台或日志文件(使用您使用的任何日志记录机制)中记录一条警告,宣布这将不再适用于下一个主要版本。为了避免垃圾邮件,您只能记录一次(例如private static boolean warningLogged).

步骤2b:静态代码分析

静态代码分析器如声纳Qube(也可作为托管服务) 可以设置为标记每个警告。 SonarQube 规则“不应使用已弃用的代码”如果编译器的弃用使用警告被抑制,甚至应该可以工作。

SonarQube 还跟踪某个问题(即违反规则)的引入时间(基于版本控制),您可以根据该日期交互式地过滤其问题列表。例如,您可以列出已在代码库中存在一年多的已弃用代码的所有用法,以便您可以优先考虑修复它们的工作。

第 3 步:删除 API

不实际删除 API 会给 API 用户留下他们不需要费心更改代码的印象。

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

Java Deprecated API 和 SuppressWarnings“弃用” - 实用方法 的相关文章

  • Android Studio 0.8.2 URI 有一个权限组件

    我收到 Gradle 项目同步失败 消息 当我启动 Android Studio 时 当我尝试清理项目时 我收到 无法完成 Gradle 执行原因 URI 具有权限组件 我已经尝试了几件事 但仍然陷入困境 我将配置文件从用户文件夹中移出 并
  • 切换大小写错误。用于 Mac 上 Android 开发的 Eclipse IDE:将工作区合规性更改为 JRE 1.7

    当尝试在 android 项目中使用带有 switch string 的 Switch Case 时 我在 eclipse IDE 中收到错误消息 将工作区合规性更改为 JRE1 7 对于低于 1 7 的源级别 无法打开字符串类型的值 仅允
  • Java 8 文档日期时间教程错误

    The Oracle 临时查询教程页面 https docs oracle com javase tutorial datetime iso queries html显示此示例代码 Code TemporalQueries query Te
  • 为什么java中的BigInteger被设计成不可变的?

    在 java 中 BigInteger 是不可变的 但我想了解为什么 因为很多时候它用于进行大量计算 从而产生大量对象 所以 不让它变得不可变感觉有点直观 我想到的情况类似于字符串操作 然后是 StringBuilder 的选项 是否应该有
  • JTextPane 的样式是否具有类似控制台的格式?

    有没有办法使 JTextPane 中的文本看起来与控制台输出的文本相似 我的意思是 基本上 每个字符如何具有相同的宽度 以便 ASCII 艺术或间距缩进之类的东西可以正常工作 例如 目前 如果我输入 First 然后输入 5 个空格 然后在
  • 无法解析符号“AuthUI”

    我正在添加 firebase google 和 Gmail 登录 但是当我粘贴代码时 onAuthStateChanged NonNull FirebaseAuth firebaseAuth 方法我收到此错误 无法解析符号 AuthUI 在
  • 理解 Spring AOP [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 Spring 3 0 框架 但仍然是新手 谁能通俗地解释一下什么是AOP编程 一个简短的例子肯定会有帮助 Spring 如
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • java中使用多个分隔符分割字符串

    我正在研究一种数据挖掘算法 我需要使用多个单词来标记字符串 我有一个单独的文件 其中包含所有停用词 我需要做的是通过任何作为分隔符的单词 停用词 来标记输入字符串 例如 如果文件包含停用词 a is and of that 输入字符串变为
  • 为什么 java.util.concurrent.FutureTask 不可序列化

    我目前正在使用 Apache Wicket 我有一些 REST 调用 每个调用需要几秒钟 Wicket 只允许同步调用 ajax 所以我尝试使用 Future 和 Callable 这是我的课程的一部分 public abstract cl
  • 动态添加的 RemoteView 上的布局权重

    在我的小部件中 我使用以下内容将项目 R layout widget item 动态添加到我的主小部件布局中定义的 LinearLayout 中 Main widget layout RemoteViews views new Remote
  • 片段和通知:针对通知中的不同活动;取决于屏幕配置

    问题 如何决定做什么Activity a Notification如果目标可能取决于配置 屏幕尺寸 方向等 则应启动 就像人们使用时经常出现的情况一样Fragments Details 让我们考虑一下新闻阅读器示例 http develop
  • 如何在 selenium webdriver 中将网络浏览器从 Firefox 更改为 Chrome/Opera/IE/Safari?

    如何将浏览器从 firefox 更改为在 selenium webdriver 中工作的 Chrome Opera IE 请指导步骤以及代码片段 如果您对上述任何浏览器有答案 请回复 我读了很多这方面的内容 但无法正确链接 首先 您需要将正
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • [PersistenceUnit:<名称>]:无法构建EntityManagerFactory

    正如主题所述 我的问题是EntityManagerFactory无法建造 我正在使用 Maven Hibernate 我正在连接到 MySQL 数据库
  • 从多个文本文件读取数据[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是Java编程新手 我正在尝试打印
  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • 在 Android 中创建硬链接和符号链接

    我正在创建一个应用程序 我想在其中使用 Android 外部内存文件系统中的硬链接和符号链接 我尝试过使用命令 Os link oldpath newpath Os link oldpath newpath 但是 当我尝试这样做时 我收到此
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean

随机推荐

  • HttpResponse 不包含 Dot Net Core 的 AddHeader 的定义

    将项目移至 Net Core 时 AddHeader抛出错误 错误 CS1061 HttpResponse 不包含定义 AddHeader 且没有扩展方法 AddHeader 接受第一个 可以找到 HttpResponse 类型的参数 您是
  • 哪些操作系统不会在程序退出时释放内存?

    这个问题让我很好奇 像这样的问题总是得到诸如 它通常是安全的 但你不应该假设操作系统会为你做这件事 这样的答案 这对我来说听起来是个好建议 但我想知道 是否有任何积极开发 发布 的不执行此操作的操作系统 这是恐龙时代 80年代 就被修复的东
  • 仅返回 mongo 投影中的数组值

    有没有办法只返回 mongodb 投影中属性的值 例如 我有一个文档 其中有一个属性 其值为数组 我希望查询的返回对象只是数组 而不是property 例子 文档 db test insert name Andrew attributes
  • 如何在Android中播放在线视频?

    我正在 Android 中开发一个示例媒体播放器应用程序来播放在线视频 我已经开发了一些代码来播放视频 它可以很好地播放 SD 卡中的视频 但我在这方面面临两个问题 1 当我打开在线视频应用程序时 它会显示视频 但不会播放视频 一段时间后
  • Android XML DOM 解析中如何解析同名标签?

    我无法在这里解析我的 XML 它仅返回 项目 My AndroidActivity由于太大而无法显示 这就是为什么我只展示了负责解析的部分 我的 XML 看起来像这样
  • 使用 pyparsing 的递归表达式

    我试图弄清楚如何执行左关联表达式 其中递归 不包含在任何内容中 表达式是可能的 例如 我想做 expr OP expr 解析 2 个操作 例如1 x 2 x 3 into expr OP expr OP expr result 如果我试图阻
  • connection.setRequestProperty 和显式写入 urloutputstream 相同吗?

    URL url new URL http www example com comment HttpURLConnection connection HttpURLConnection url openConnection connectio
  • 如何添加触发翻译的谷歌翻译链接?

    我有一个保加利亚语网页 我希望我的用户能够将其一键翻译成英语 此外 当用户进入页面时 页面顶部不应有任何翻译横幅 在用户单击翻译链接后可以 我尝试过使用 googtrans bg en doc 但它不起作用 而且由于以下代码 它还在页面顶部
  • rxjs中如何做链序列

    我想要这样的事情 this myService doSomething subscribe result gt doSomething then gt dosthelse then gt dosanotherthing 所以我想链接 the
  • CSS 重新居中换行元素

    我以为这很简单 但事实证明有点令人头疼 当用户调整浏览器大小并导致其中一个 或多个 换行到下一行时 我试图让图像网格重新居中 我尝试过给网格包装器 display inline block 它的父级值为 text align center
  • 如何在“Java Swing”中获取鼠标悬停事件

    我有一个JPanel其中有多个组件 就像一些JLabels JTextBoxes JComboBoxes JCheckBoxes etc 如果用户将鼠标悬停在这些组件上 3 秒 我想显示一个弹出帮助窗口 到目前为止我添加了一个MouseLi
  • Azure 访问令牌 - Jwt.io 中的签名无效

    这真是一场噩梦 我在使用 jwt io 验证 Azure 访问令牌签名时遇到问题 不管我做什么 答案总是无效的签名 有人可以尝试帮忙解决这个问题吗 我的步骤 我从 MSAL Java 应用程序示例 msal java webapp samp
  • 如何查找或插入 Vec [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个函数 该函数查找返回对 Vec 中现有元素的可变引用 或者如果不存在则将其插入并返回对新元素的可变引用 我已经尝试过几次 但借用检查员不相信 我已将尝试编写的代码简化为下面的示例 该示例给出了相
  • Maven 正在尝试从 maven.ocean.net.au 更新 glassfish 插件

    我们无法部署我们的应用程序 因为 Maven 正在尝试从 maven ocean net au 存储库更新 glassfish 插件 尽管我们的 pom 中没有定义这样的存储库 问题是 maven ocean net au 不在线 因此我们
  • 合并两个 SQLite 数据库文件 (C# .NET)

    我将 C NET 与 SQLite 的 C 包装器一起使用 我正在尝试将两个 SQLite 数据库合并在一起 同时排除重复项 我发现了这个 这是从几个不同的论坛问题中引用的 http old nabble com Attempting to
  • 如果函数声明了返回类型,mypy 是否仅对函数进行类型检查?

    以下文件 from typing import List class A def init self myStr self chars List int list myStr def toString self return join se
  • 使用 ant 或 maven 执行我的 groovy 脚本

    我有以下内容 1个java类 1 个bat 文件 启动groovy 脚本 1 个常规文件 全部在同一个文件夹中 现在我想使用 Maven 或 Ant 来运行 groovy 文件 但我无法让它工作 有人可以告诉我如何编写这个 pom xml
  • 使用 ArrayWritable 进行序列化似乎以一种有趣的方式工作

    我正在与ArrayWritable 在某些时候我需要检查 Hadoop 如何序列化ArrayWritable 这是我通过设置得到的job setNumReduceTasks 0 0 IntArrayWritable 10f11b8 3 In
  • 由于 LARGEADDRESSAWARE 检测指针算术

    我想将我的应用程序切换到LARGEADDRESSAWARE 需要注意的问题之一是指针算术 因为指针差异不再可以表示为有符号 32b 有没有办法在大型 C 项目中自动查找指针减法的所有实例 如果没有 是否有一些 最省力 的手动或半自动方法如何
  • Java Deprecated API 和 SuppressWarnings“弃用” - 实用方法

    我见过很多例子使用DeprecatedAPI 上的注释以便将它们标记为 需要尽快更换 然而 在几乎所有这些情况下 代码开发人员不仅继续使用已弃用的 API 而且还继续使用已弃用的 API 抑制了弃用警告 API 开发人员的最佳意图似乎最终会