我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 8 - 类型注解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 8 - 类型注解

理解Java 8 类型注解需理解几个问题: @pdai

  • 注解在JDK哪个版本中出现的,可以在哪些地方用注解?
  • 什么是类型注解?
  • 类型注解的作用是什么?
  • 为什么会出现类型注解(JSR308)?
  • Java 8 - 类型注解
    • 什么是类型注解
    • 类型注解的作用
    • 类型注解向下兼容的解决方案
    • 关于JSR 308
    • 总结

# 什么是类型注解

注解大家都知道,从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置。那充满争议的类型注解究竟是什么? 复杂还是便捷?

  1. 在java 8之前,注解只能是在声明的地方所使用,比如类,方法,属性;

  2. 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是第三方工具,配合Java的类型注解效果就是1+1>2。它可以嵌入到javac编译器里面,可以配合ant和maven使用, 地址是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() {
         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,毕竟代码才是“最基本”的文档,这句话我是赞同的。虽然代码会增多,但可以使你的代码更具有表达意义。对这个特性有何看法,大家各抒己见。。。。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 8 - 类型注解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 8 - 类型注解

理解Java 8 类型注解需理解几个问题: @pdai注解在JDK哪个版本中出现的,可以在哪些地方用注解?什么是类型注解?类型注解的作用是什么?为什么会出现类型注解(JSR308)?Java 8 - 类型注解什么是类型注解类型注解的作用类型
2022-12-02

Java 8中类型注解是变的复杂还是便捷

Java 8中类型注解是变的复杂还是便捷,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解大家都知道,从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了
2023-06-17

Java 8 - 类型推断优化

理解Java 8 类型推断需理解几个问题: @pdai什么是泛型Java7对泛型推断做了哪些优化Java8对此有做了哪些优化Java 8 - 类型推断优化简单理解泛型泛型的尴尬java7的泛型类型推断改进Java8的泛型类型推断改进总结#
2022-12-02

介绍java的注解类型

这篇文章主要介绍“介绍java的注解类型”,在日常操作中,相信很多人在介绍java的注解类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”介绍java的注解类型”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-06

Java 8 - 重复注解

理解Java 8 重复注解需理解几个问题: @pdaiJdk8之前对重复注解是怎么做的?Jdk8对重复注解添加了什么支持?Java 8 - 重复注解什么是重复注解JDK8之前Jdk8重复注解总结# 什么是重复注解允许在同一申明类型(类,属性
2022-12-02

java中注解有哪些类型

java中注解有哪些类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发
2023-06-14

python类型注解

函数注解Function Annotations函数注解    Python 3.5引入    对函数的参数进行类型注解    对函数的返回值进行类型注解    只对函数参数做一个辅助的说明,并不对函数参数进行类型检查    提供给第三方工
2023-01-31

Java 8 - Optional类深度解析

对Java 8 Optional类进行深度解析。 @pdaiJava 8 - Optional类深度解析Optional类包含的方法ofofNullableisPresentgetifPresentorElseorElseGetorElse
2022-12-02

Java 8注解语法有哪些

这篇文章主要讲解了“Java 8注解语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java 8注解语法有哪些”吧!注解语法注解由字符 @ 和注解名组成,即 @AnnotationN
2023-06-02

Java 8中如何进行泛型的目标类型推断

Java 8中如何进行泛型的目标类型推断,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的
2023-06-17

Java注解类型的语法标准是什么

这篇文章主要介绍“Java注解类型的语法标准是什么”,在日常操作中,相信很多人在Java注解类型的语法标准是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java注解类型的语法标准是什么”的疑惑有所帮助!
2023-06-26

Java 8中重复注解是怎样的

Java 8中重复注解是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 什么是重复注解允许在同一申明类型(类,属性,或方法)的多次使用同一个注解一个简单的例子java
2023-06-17

Python-typing: 类型标注与支持 Any类型详解

Any docs Any 是一种特殊的类型。 静态类型检查器将所有类型视为与 Any 兼容,反之亦然, Any 也与所有类型相兼容。 这意味着可对类型为 Any 的值执行任何操作或方法调用,并将其赋值给任何变量:from typing im
2022-06-02

详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池

Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然
2023-06-05

Java基础8:深入理解内部类

更多内容请关注微信公众号【Java技术江湖】这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、EL
2023-06-02

如何使用TypeScript类型注解

小编给大家分享一下如何使用TypeScript类型注解,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!类型注解TypeScript提供了很多数据类型,通过类型对变量进行限制,称之为类型注解,使用类型注解后,就不能够随意变更变
2023-06-29

4.93Python数据类型之(8)集合

目录 目录 前言 (一)基本概念 ==1.1有序于无序== ==1.2是否随机访问== ==1.3重复性== ==1.
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录