我们都知道 Java 有一个java.lang.Deprecated注解,用来将一个 API 标记为“废弃”,或者说“不建议使用”。比如 String 类就有一个被标记为 Deprecated的构造函数:

@Deprecated
public String(byte ascii[], int hibyte) {this(ascii, hibyte, 0, ascii.length);
}

Java 还提供了一个 @deprecated 的文档标签,用于提供相关信息。

这个注解存在几个缺陷:

  • 无法禁止使用废弃的 API,单单一个编译警告不可能阻止划水程序员;
  • 无法提供足够的信息,为什么这个 API 被废弃了?需要用哪个 API 代替?毕竟文档注释不是强制性的。

对于这个问题,Kotlin 的解决方案是 kotlin.Deprecated 注解,它比 java.lang.Deprecated更强大、更人性化。

kotlin.Deprecated的声明如下:

@Target(CLASS, FUNCTION, PROPERTY, ANNOTATION_CLASS, CONSTRUCTOR, PROPERTY_SETTER, PROPERTY_GETTER, TYPEALIAS)
@MustBeDocumented
public annotation class Deprecated(val message: String,val replaceWith: ReplaceWith = ReplaceWith(""),val level: DeprecationLevel = DeprecationLevel.WARNING
)
  • @Target 表示 Deprecated可以用在类、函数、属性、注解类、构造函数、getter、setter 和类型别名上;
  • @MustBeDocument表示Deprecated是个公开的 API,必需包含在 API 文档里。

我们重点看三个参数:

第一个参数很简单,String 类型的 message,需要在这里说明废弃的原因。

@Deprecated("this function is deprecated!")
fun oldAdd(a: Int, b: Int) {println(a + b)
}fun main(args: Array<String>) {oldAdd(1, 2)
}

比如我们定义了上面的函数 oldAdd,用 Deprecated 标注一下,如果调用这个函数,就会出现编译警告:

Warning:(7, 5) Kotlin: ‘oldAdd(Int, Int): Unit’ is deprecated. this function is deprecated!

我们定义 Deprecated 时给的 this function is deprecated! 出现在了警告信息里,让我们排查问题方便不少。

第三个参数是DeprecationLevel这个枚举里定义的三个废弃级别之一,在使用了 Deprecated API 的地方给出不同级别的警告 :

public enum class DeprecationLevel {WARNING,ERROR,HIDDEN
}
  • WARNING:默认选项,编译依然会成功,但会出现编译警告;
  • ERROR:编译错误,相当于禁止使用这个 API;
  • HIDDEN:隐藏,无法调用这个 API。

我们把上面的代码改一下,加上自定义的废弃级别:

@Deprecated("this function is deprecated!",ReplaceWith(""), // 无法省略level = DeprecationLevel.ERROR
)
fun oldAdd(a: Int, b: Int) {println(a + b)
}

再编译就会出现编译错误,编译直接失败:

Error:(11, 5) Kotlin: Using ‘oldAdd(Int, Int): Unit’ is an error. this function is deprecated!

如果换成HIDDEN

Error:(11, 5) Kotlin: Unresolved reference: oldAdd

找不到这个函数了……

最后是第二个参数,需要是 ReplaceWith 类型,它是一个注解类型(因为注解的参数只能是基本类型、String 和注解类型)。声明如下:

@Target()
@Retention(BINARY)
@MustBeDocumented
public annotation class ReplaceWith(val expression: String, vararg val imports: String)
  • expression 是要替换成的代码段,智能替换参数;
  • imports 是需要额外 import 的依赖。

定义一个函数newAdd,放进new包里:

package newfun newAdd(a: Int, b:Int) {println("$a + $b = ${a + b}")
}

然后修改一下oldAdd 函数:

@Deprecated("this function is deprecated!",ReplaceWith("newAdd(a, b)", "new.newAdd")
)
fun oldAdd(a: Int, b: Int) {println(a + b)
}

这样,我们在 IDEA 里就可以按 Alt + Enter 一键替换:

替换时会自动匹配参数,并导入 imports 中定义的依赖:

原文链接:https://zhuanlan.zhihu.com/p/32890550

比 Java 更强大的 kotlin.Deprecated相关推荐

  1. Android_Kotlin原生开发_认识Kotlin_了解Kotlin和JVM虚拟机关系_认识Kotlin的重要性_更强大的跨平台特性_不需要JVM虚拟机也可跨平台---Kotlin工作笔记001

    1.谷歌支持Kotlin作为android第一开发语言,因为java是已经被oracle收购了,可能会对Google收费. 2. 可以看到java语言写的android程序,实际上回编译成字节码,在j ...

  2. Java基础学习总结(178)——时候替换你的logback/log4j1了,使用性能更强大配置更简单的log4j2

    Log4j2简介 Apache Log4j 2是 Log4j(1) 的升级版,比它的祖先 Log4j 1. x 有了很大的改进,和logback对比有很大的改进.除了内部设计的调整外,主要有以下几点的 ...

  3. java后台如何实现让用户可以在页面修改数据表_长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽......

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...

  4. 长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...

  5. Java!越来越像Kotlin了!!

    作者 | The Bored Dev 译者 | 张卫滨 策划 | 蔡芳芳 来自不同编程语言的竞争正促使 Java 不断吸收新特性,变得更能适应时代和开发人员的新需求. 本文最初发表于 The Bore ...

  6. Java 已老,Kotlin 或将取而代之!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! Java已经成为历史.它无法发展成现代语言,同时保证向后兼容性.但它为我们带来了最好的JVM ...

  7. summerDao-比mybatis更强大无需映射配置的dao工具

    summerDao是summer框架中的一个数据库操作工具,项目地址:http://git.oschina.net/xiwa/summer. 怎么比mybatis更强大,怎么比beetlsql更简单, ...

  8. java更好的语言_五个使Java变得更好的功能

    java更好的语言 我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法. 我实际上有很多,但这只是五个最重要的简短列表. ...

  9. python kotlin_用Java和Python模仿Kotlin构建器

    python kotlin 介绍 Kotlin可能现在是我最喜欢的语言,可能它提供的最酷的功能之一是基于几个功能构建的类型安全的生成器(稍后解释). 我发现自己真的很想在其他两种主要语言(Java和P ...

  10. java更好的语言_Java,如果这是一个更好的世界

    java更好的语言 只是梦想着有一个更好的世界,在该世界中,Java平台中的一些旧错误已得到纠正,而某些令人敬畏的缺失功能也已实现. 不要误会我的意思. 我认为Java很棒. 但是它仍然存在一些问题, ...

最新文章

  1. flood fill算法
  2. [云炬创业学笔记]第二章决定成为创业者测试13
  3. java跳转_java 跳转语句
  4. JavaScript判断一个变量是对象还是数组
  5. PHP图形图像的典型应用 --常用图像的应用(验证码)
  6. 48道C语言上机题参考答案,二级C语言上机题库参考答案(已修改).doc
  7. 【PhotoShop】ps 基础知识
  8. SD卡和TF卡的区别/差异
  9. beacon帧主要结构
  10. java 画折线图_jfreechart画折线图的方法
  11. labview调用DLL
  12. 上海电气集团数科总经理程艳:工业互联网赋能集团型企业转型发展
  13. 腹板拼接宽度_钢结构拼接相关规范要求
  14. java获取首字母_Java 获取中文首字母的方法
  15. BitTorrent协议DHT网络爬虫BitTorrentNetworkSpider
  16. win10右键卡顿问题 简单实用
  17. Lesson 018 —— python 集合
  18. 八进制和十六进制表示
  19. 关于市面上含有高级辅助驾驶功能的汽车事故问题思考
  20. 改善深层神经网络:超参数调试、正则化以及优化(三)

热门文章

  1. Powerdesigner显示表的comment和列的comment的方法
  2. WEB前端小米商城网页制作
  3. 电脑各个硬件的理论知识 经典
  4. 冯·诺依曼,天才中的天才
  5. 计算机毕业设计(附源码)python智慧门诊综合管理系统
  6. 我们公司没销售 - 疫情下企业软件的互联网营销
  7. 图片不能承受之重-转
  8. 浅谈一下pyd文件的逆向
  9. Material Theme UI 插件的下载安装与使用,免费版Material Theme UI 插件
  10. Fedora13装nividia驱动