【intellij】External and inferred annotations

背景

    Effective Java 中文版(原书第3版)的163页用到Stream.iterate(TWO, BigInteger::nextProbablePrime)用于生成素数流,引起我对这个函数的兴趣,一方面是它如何使用参数一来生成大于参数一的素数,另一方法是好奇BigInteger竟可以提供素数生成,再也不用手写素数判定方法了。
    打开Intellij查看Stream.iterate源码,发现灰色的@Contract(pure=true) @NotNull。这行灰色字符既复制不了,也没有import过。鼠标放在@符号上,提示“External and inferred annotations”。好奇它们的作用,于是探求。

总结

    在百度搜索@Contract(pure=true) @NotNull,点开文章1,它是讲解这两个注解的含义的,讲的不错,原来这两个注解是jetbrains的。
    参考文章2导入包,并编写类,仿造Stream.iterate使用Objects.requireNonNull,点击类方法左边提示的@符号,选择insert,@Contract就被加到方法上了,并且可看到import了。
    但我的疑惑是,为啥别人的类中该注解是灰色的,没有import。当我点击Stream.iterate的@符号弹出选项,提示我可以Edit method contract of iterate,点击它后发现我可以编辑contract且要保存到某个路径。于是隐隐觉得,灰色是因为是外部存储的注解。
    文章3讲了如何分析及推断Nullable,分析时可选是否为其加上注解。我的2018版code下没有analyze,与code平级的analyze下有infer nullity,遂选之,效果是为我的参数自动加了@NotNull注解并import了。18版没有看到仅分析不自动加注解的选项,而文章3是21版。考虑安装license太难得到,所以就不升级版本了。文章3讲到的Inlay Hints显示的效果就是灰色的@Contract注解,但我的18版本没有该配置处,所以无法验证。但通过上面的过程,大概了解了工具是可以帮我们推断出来参数、返回值是否非空,方法是否是幂等。我们可以自己主动analyze代码并选择是否将推断的判空注解注释到变量上。应该也可以将其存到外部文件,以依赖包提供的时候,供查看方便,非功能性注解,仅增强可读性,为灰,不import。
    文章4很直白地说出了我的理解。
    讲真,如果你的接口提供给它人使用,你的api包里可以使用"外部注释"增强可读性,即使是内部代码,我觉得使用这些注解也能提高可读性,是可取的。
    文章5解答了@Contract和@NotNull都可以表达相同意思时,该如何选择的问题。

待做

    在实践中验证外部配置注解的情况下,无用代码是否能被提示出来,还是说要显示加注解。
    无用代码指的是方法一注解表明若入参为null则返回null,方法二调用方法一时传的是null(null字面量,非运行时对象引用为null,因此可以编译期发现),接着将返回值作空判别。显示判别是无意义的,本就是空。


  1. https://blog.csdn.net/howeres/article/details/119875169
    JetBrains注解@NotNull/@Nullable/@Contract ↩︎

  2. https://www.w3cschool.cn/intellij_idea_doc/intellij_idea_doc-u4jy2ems.html
    IntelliJ IDEA怎么使用@Contract注释 ↩︎

  3. https://www.jetbrains.com/help/idea/inferring-nullity.html
    Infer nullity ↩︎ ↩︎ ↩︎

  4. https://www.w3cschool.cn/intellij_idea_doc/intellij_idea_doc-map52eov.html
    IntelliJ IDEA外部注释的使用 ↩︎

  5. https://stackoverflow.com/questions/31473060/when-to-use-contractnull-fail-and-when-to-use-notnull
    When to use @Contract(“null -> fail”) and when to use @NotNull ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"git分析代码 can't resolve reference 'org.intellij.lang.annotations.flow" 通常表示在git分析代码时,出现了无法解析引用的错误,具体指向了 'org.intellij.lang.annotations.flow'。这可能是因为代码中使用了需要额外引入的某种注释或语法规则。 要解决此问题,可以按照以下步骤进行操作: 1. 检查代码中是否确实使用了 'org.intellij.lang.annotations.flow' 的引用。在代码中搜索此引用,确保它是正确的,并且确实需要引入。 2. 确认项目是否正确配置了相关依赖项。在项目的构建文件(如pom.xml或build.gradle)中,检查是否已经添加了包含 'org.intellij.lang.annotations.flow' 的依赖项。如果没有,则需要手动添加。 3. 如果确定需要引入 'org.intellij.lang.annotations.flow',但项目中找不到相应的依赖项,可以尝试搜索并下载合适的jar包。可以通过搜索引擎或在Maven中央仓库(https://mvnrepository.com/)中查找并下载相关jar包。 4. 将下载的jar包添加到项目的构建文件中。具体操作取决于使用的构建工具,例如在pom.xml中使用Maven,可以将jar包作为依赖项添加到<dependencies>部分中。 5. 执行构建。使用构建工具(如Maven或Gradle)重新构建项目,以确保所有依赖项都已正确配置和引入。 如果按照上述步骤操作后仍然出现问题,可能需要进一步检查项目配置、环境变量以及IDE设置等因素。也可以尝试在相关论坛或社区寻求帮助,以了解其他人如何解决类似问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值