@Deprecated注解在Java 9新增forRemoval属性以细化“过时”语义:true表示已列入删除计划(如Thread.stop()),false为默认值仅表不推荐;需配合since和Javadoc构成完整废弃声明,纯编译期提示,不影响运行时行为。

@Deprecated 注解在 Java 9 中新增了 forRemoval 属性,用于明确标识某个 API 是否“计划被物理删除”——这是对“过时(deprecated)”语义的一次关键细化。
forRemoval = true 表示“真要删了”
设置 forRemoval = true 意味着该元素不仅不推荐使用,而且**已在后续版本的删除计划中**。JDK 自身大量采用此方式标记(如 Java 14+ 中的 Thread.stop()、Thread.suspend() 等),向开发者发出强警告:别再依赖,迁移越早越好。
- 编译器不会因 forRemoval=true 而改变错误/警告行为(仍只是 warning)
- 但 IDE(如 IntelliJ、Eclipse)通常会用更醒目的样式(如带删除线 + “Will be removed” 提示)高亮显示
- 构建工具(如 Maven Enforcer Plugin)或静态分析工具(如 SpotBugs)可配置规则,将 forRemoval=true 的调用视为构建失败项
forRemoval = false 是默认值,仅表示“不鼓励用”
未显式指定或写成 @Deprecated(forRemoval = false),含义与 Java 8 及以前的 @Deprecated 完全一致:功能尚存,但已有更好替代方案,建议迁移到新 API。
- 常见于保留兼容性但已不推荐的桥接方法、旧构造器、冗余 getter/setter
- 此时 不暗示删除时间表,可能长期保留(如
java.util.Date多数方法)
搭配 since 和 javadoc 才算完整标记
单独用 @Deprecated(forRemoval = true) 不够友好。最佳实践是三者并用:
-
@Deprecated(forRemoval = true)—— 机器可读的删除信号 -
@Deprecated(since = "17")—— 标明从哪个版本开始标记为废弃(Java 9+ 支持) - Javadoc 中明确写出替代方案和删除预期(例如:“This method will be removed in JDK 21. Use
Files.readString(Path)instead.”)
注意:forRemoval 不影响运行时行为
无论 forRemoval 是 true 还是 false,代码在当前版本中依然能正常编译和运行。它纯粹是**一种契约式沟通机制**,服务于开发者协作与演进治理。
- 不能靠它做运行时判断(反射获取不到 forRemoval 值,因为该属性在字节码中不保留)
- 它的价值体现在开发阶段:提醒、约束、自动化检查、文档同步

















