返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java 8 - 类型注解
  • 553
分享到

Java 8 - 类型注解

摘要

理解Java 8 类型注解需理解几个问题: @pdai注解在jdk哪个版本中出现的,可以在哪些地方用注解?什么是类型注解?类型注解的作用是什么?为什么会出现类型注解(jsR308)?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,毕竟代码才是“最基本”的文档,这句话我是赞同的。虽然代码会增多,但可以使你的代码更具有表达意义。对这个特性有何看法,大家各抒己见。。。。

--结束END--

本文标题: Java 8 - 类型注解

本文链接: https://lsjlt.com/news/173933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 8 - 类型注解
    理解Java 8 类型注解需理解几个问题: @pdai注解在JDK哪个版本中出现的,可以在哪些地方用注解什么是类型注解类型注解的作用是什么为什么会出现类型注解(JSR308)Java 8 - 类型注解什么是类型注解类型注解的作用类型注解向下...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • Java 8中类型注解是变的复杂还是便捷
    Java 8中类型注解是变的复杂还是便捷,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解大家都知道,从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了...
    99+
    2023-06-17
  • Java 8 - 类型推断优化
    理解Java 8 类型推断需理解几个问题: @pdai什么是泛型Java7对泛型推断做了哪些优化Java8对此有做了哪些优化Java 8 - 类型推断优化简单理解泛型泛型的尴尬java7的泛型类型推断改进Java8的泛型类型推断改进总结# ...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • Java 8 - 重复注解
    理解Java 8 重复注解需理解几个问题: @pdaiJdk8之前对重复注解是怎么做的Jdk8对重复注解添加了什么支持Java 8 - 重复注解什么是重复注解JDK8之前Jdk8重复注解总结# 什么是重复注解允许在同一申明类型(类,属性,或...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • 介绍java的注解类型
    这篇文章主要介绍“介绍java的注解类型”,在日常操作中,相信很多人在介绍java的注解类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”介绍java的注解类型”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-06
  • java中注解有哪些类型
    java中注解有哪些类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发...
    99+
    2023-06-14
  • python类型注解
    函数注解Function Annotations函数注解    Python 3.5引入    对函数的参数进行类型注解    对函数的返回值进行类型注解    只对函数参数做一个辅助的说明,并不对函数参数进行类型检查    提供给第三方...
    99+
    2023-01-31
    注解 类型 python
  • Java 8 - Optional类深度解析
    对Java 8 Optional类进行深度解析。 @pdaiJava 8 - Optional类深度解析Optional类包含的方法ofofNullableisPresentgetifPresentorElseorElseGetorElse...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • Java 8注解语法有哪些
    这篇文章主要讲解了“Java 8注解语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java 8注解语法有哪些”吧!注解语法注解由字符 @ 和注解名组成,即 @AnnotationN...
    99+
    2023-06-02
  • Java 8中如何进行泛型的目标类型推断
    Java 8中如何进行泛型的目标类型推断,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的...
    99+
    2023-06-17
  • Java注解类型的语法标准是什么
    这篇文章主要介绍“Java注解类型的语法标准是什么”,在日常操作中,相信很多人在Java注解类型的语法标准是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java注解类型的语法标准是什么”的疑惑有所帮助!...
    99+
    2023-06-26
  • PHP 的8种数据类型
    PHP 变量存储不同的类型的数据,不同的数据类型能做不一样的事情。 PHP 支持以下8种数据类型: Integer(整型) String(字符串) Boolean(布尔型) Float(浮点型) Array(数组) NULL(空值) Obj...
    99+
    2023-09-05
    php 开发语言 服务器 数据库 运维
  • Java 8中重复注解是怎样的
    Java 8中重复注解是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 什么是重复注解允许在同一申明类型(类,属性,或方法)的多次使用同一个注解一个简单的例...
    99+
    2023-06-17
  • 详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池
    Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然...
    99+
    2023-06-05
  • Python-typing: 类型标注与支持 Any类型详解
    Any docs Any 是一种特殊的类型。 静态类型检查器将所有类型视为与 Any 兼容,反之亦然, Any 也与所有类型相兼容。 这意味着可对类型为 Any 的值执行任何操作或方法调用,并将其赋值给任何变量: ...
    99+
    2022-06-02
    Python typing 类型标注 支持Any类型
  • Java基础8:深入理解内部类
    更多内容请关注微信公众号【Java技术江湖】这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、EL...
    99+
    2023-06-02
  • 4.93Python数据类型之(8)集合
    目录 目录 前言 (一)基本概念 ==1.1有序于无序== ==1.2是否随机访问== ==1.3重复...
    99+
    2023-01-30
    数据类型 Python
  • Java中值类型和引用类型详解
    我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型的变量也是一个对象的话,那么我们应该能用&...
    99+
    2024-04-02
  • 【Python】类型注解 ⑤ ( Union 联合类型注解 | Union 联合类型语法 | 普通 / 容器 变量设置 Union 联合类型注解 | 函数设置 Unio&
    文章目录 一、Union 联合类型1、数据容器的类型注解问题2、Union 联合类型语法3、代码示例 - 普通变量设置 Union 联合类型注解4、代码示例 - ...
    99+
    2023-09-02
    python 开发语言 Union 联合类型 类型注解 原力计划
  • 如何使用TypeScript类型注解
    小编给大家分享一下如何使用TypeScript类型注解,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!类型注解TypeScript提供了很多数据类型,通过类型对变量进行限制,称之为类型注解,使用类型注解后,就不能够随意变更变...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作