Java8新特性之类型注解_动力节点Java学院整理
发布时间 - 2026-01-11 01:47:51 点击率:次注解从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置。那充满争议的类型注解究竟是什么?复杂还是便捷?

什么是类型注解
在java 8之前,注解只能是在声明的地方所使用,比如类,方法,属性;java 8里面,注解可以应用在任何地方,比如:
- 创建类实例
new @Interned MyObject();
- 类型映射
myString = (@NonNull String) str;
- implements 语句中
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
- throw exception声明
void monitorTemperature() throws @Critical TemperatureException { ... }
需要注意的是,类型注解只是语法而不是语义,并不会影响java的编译时间,加载时间,以及运行时间,也就是说,编译成class文件的时候并不包含类型注解。
类型注解的作用
先看看下面代码
Collections.emptyList().add("One");
int i=Integer.parseInt("hello");
System.console().readLine();
上面的代码编译是通过的,但运行是会分别报UnsupportedOperationException; NumberFormatException;NullPointerException异常,这些都是runtime error;
类型注解被用来支持在Java的程序中做强类型检查。配合插件式的check framework,可以在编译的时候检测出runtime error,以提高代码质量。这就是类型注解的作用了。
check framework
check framework是第三方工具,配合Java的类型注解效果就是1+1>2。它可以嵌入到javac编译器里面,可以配合ant和maven使用,也可以作为eclipse插件。地址是http://types.cs.washington.edu/checker-framework/。
check framework可以找到类型注解出现的地方并检查,举个简单的例子:
import checkers.nullness.quals.*;
public class GetStarted {
void sample() {
@NonNull Object ref = new Object();
}
}
使用javac编译上面的类
javac -processor checkers.nullness.NullnessChecker GetStarted.java
编译是通过,但如果修改成
@NonNull Object ref = null;
再次编译,则出现
GetStarted.java:5: incompatible types.
found : @Nullable <nulltype>
required: @NonNull Object
@NonNull Object ref = null;
^
1 error
如果你不想使用类型注解检测出来错误,则不需要processor,直接javac GetStarted.java是可以编译通过的,这是在java 8 with Type Annotation Support版本里面可以,但java 5,6,7版本都不行,因为javac编译器不知道@NonNull是什么东西,但check framework 有个向下兼容的解决方案,就是将类型注解nonnull用/**/注释起来
,比如上面例子修改为
import checkers.nullness.quals.*;
public class GetStarted {
void sample() {
/*@NonNull*/ Object ref = null;
}
}
这样javac编译器就会忽略掉注释块,但用check framework里面的javac编译器同样能够检测出nonnull错误。
通过类型注解+check framework我们可以看到,现在runtime error可以在编译时候就能找到。
关于JSR 308
JSR 308想要解决在Java 1.5注解中出现的两个问题:
- 在句法上对注解的限制:只能把注解写在声明的地方
- 类型系统在语义上的限制:类型系统还做不到预防所有的bug
JSR 308 通过如下方法解决上述两个问题:
对Java语言的句法进行扩充,允许注解出现在更多的位置上。包括:方法接收器(method receivers,译注:例public int size() @Readonly { ... }),泛型参数,数组,类型转换,类型测试,对象创建,类型参数绑定,类继承和throws子句。其实就是类型注解,现在是java 8的一个特性
通过引入可插拔的类型系统(pluggable type systems)能够创建功能更强大的注解处理器。类型检查器对带有类型限定注解的源码进行分析,一旦发现不匹配等错误之处就会产生警告信息。其实就是check framework
对JSR308,有人反对,觉得更复杂更静态了,比如
@NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
换成动态语言为
var strings = ["one", "two"];
有人赞成,说到底,代码才是“最根本”的文档。代码中包含的注解清楚表明了代码编写者的意图。当没有及时更新或者有遗漏的时候,恰恰是注解中包含的意图信息,最容易在其他文档中被丢失。而且将运行时的错误转到编译阶段,不但可以加速开发进程,还可以节省测试时检查bug的时间。
总结
并不是人人都喜欢这个特性,特别是动态语言比较流行的今天,所幸,java 8并不强求大家使用这个特性,反对的人可以不使用这一特性,而对代码质量有些要求比较高的人或公司可以采用JSR 308,毕竟代码才是“最基本”的文档,这句话我是赞同的。虽然代码会增多,但可以使你的代码更具有表达意义。对这个特性有何看法,大家各抒己见。。。。
# java8
# 类型注解
# 新特性
# Java8接口默认静态方法及重复注解原理解析
# Java8新增的重复注解功能示例
# Java8新特性之重复注解(repeating annotations)浅析
# Java8中的类型注解浅析
# Java8新特性之重复注解与类型注解详解
# 的人
# 这一
# 就会
# 才是
# 文档
# 的是
# 这是
# 我是
# 如果你
# 是在
# 子句
# 有个
# 还可以
# 就能
# 各抒己见
# 不需要
# 这就是
# 之处
# 出现在
# 遍地开花
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
html如何与html链接_实现多个HTML页面互相链接【互相】
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何在 React 中条件性地遍历数组并渲染元素
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何快速登录WAP自助建站平台?
bing浏览器学术搜索入口_bing学术文献检索地址
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
如何快速建站并高效导出源代码?
韩国服务器如何优化跨境访问实现高效连接?
微信小程序 配置文件详细介绍
Laravel如何使用Sanctum进行API认证?(SPA实战)
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
微信小程序 scroll-view组件实现列表页实例代码
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
EditPlus中的正则表达式实战(6)
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何在万网ECS上快速搭建专属网站?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Python结构化数据采集_字段抽取解析【教程】
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
nodejs redis 发布订阅机制封装实现方法及实例代码
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel如何生成URL和重定向?(路由助手函数)
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Python正则表达式进阶教程_复杂匹配与分组替换解析
javascript中的try catch异常捕获机制用法分析
如何在万网开始建站?分步指南解析
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
如何基于云服务器快速搭建网站及云盘系统?

