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


相关推荐: Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何基于云服务器快速搭建个人网站?  利用JavaScript实现拖拽改变元素大小  如何确保西部建站助手FTP传输的安全性?  如何在Windows服务器上快速搭建网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  千库网官网入口推荐 千库网设计创意平台入口  如何有效防御Web建站篡改攻击?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  lovemo网页版地址 lovemo官网手机登录  如何在宝塔面板中创建新站点?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何使用查询构建器?(Query Builder高级用法)  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站页面设计需要考虑到这些问题  如何快速辨别茅台真假?关键步骤解析  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  javascript中对象的定义、使用以及对象和原型链操作小结  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  JavaScript如何实现倒计时_时间函数如何精确控制  三星网站视频制作教程下载,三星w23网页如何全屏?  详解Android——蓝牙技术 带你实现终端间数据传输  Android自定义控件实现温度旋转按钮效果  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在香港免费服务器上快速搭建网站?  JS去除重复并统计数量的实现方法  详解阿里云nginx服务器多站点的配置  如何在Windows环境下新建FTP站点并设置权限?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  在线制作视频网站免费,都有哪些好的动漫网站?  微信公众帐号开发教程之图文消息全攻略