Java五种基本的Annotation,提高程序的可读性
从JDK5开始,Java增加了对元数据的支持,也就是Annotation(即注解也被翻译为注释)。
这里的Annotation和普通的注释有一定的区别,它是代码中的特殊标记,这些标记可以在编译、类加载或者运行时被读取,并执行相应的处理。通过这样的注解,可以帮助开发人员在不改变原有的逻辑的情况下,在源文件中补充一些信息。而代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
Annotation可以用来为程序元素(类、方法、成员变量等)设置元数据,值得一提的是,它不会影响代码的执行。
Java提供了5个基本Annotation的用法——使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符来使用。
5个基本的Annotation如下:
- @Override
- @Deprecated
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface
@Override
@Override用来指定子类必须覆盖父类的方法
public class Fruit {
public void info(){
System.out.println("Fruit");
}
}
class Apple extends Fruit{
@Override
public void info(){
System.out.println("Apple");
}
}
编译上面的程序,可能丝毫看不出@Override的用处所在,因为它的作用是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否则会编译出错。
使用@Override可以避免开发人员不小心将info方法写成了inf0方法,这样的低级错误可能会成为后期排错时的巨大障碍。
@Deprecated
@Deprecated用来表示某个程序元素(类、方法等)已经过时,当其他程序使用已经过时的类或者方法时,编译器将会给出警告。
@SuppressWarnings
@SuppressWarnings指示由它修饰的程序元素以及该元素中的所有子元素取消显示指定的编译器警告。
@SuppressWarnings(value="all")
public class Fruit {
public static void main(String[] args){
Fruit.info();
}
@Deprecated
public static void info(){
System.out.print("Fruit");
}
}
参考上面的代码,当使用了“@SuppressWarnings(value=”all”)”之后,编译器会取消使用了已经被弃用的方法的警告。value变量的值为你希望抑制的警告。
“堆污染”警告与@SafeVarargs
List ls = new ArrayList<Integer>();
ls.add(20);//添加元素时会引发unchecked警告
//下面的代码会引发“未经检验的转换”的警告,但是编译、运行时完全正常
List<String> list = ls;
//但是只要访问其中的元素,下面代码就会引起运行时异常
System.out.print(list.get(0));
Java将引发这种错误的原因称为“堆污染”。当把一个不带泛型的对象赋给一个带泛型的对象时,往往就会产生这种“堆污染”。
class UnSafeVarargs
{
static <T> T[] foo(T... args) {
return args;
}
static <T> void bar(T... args) {
for(T x : args) {
System.out.print(x);
}
}
}
考虑上面这段程序,编译器会在方法定义处提示“Possible heap pollution from parameterized vararg type”。这是因为对于形参的个数可变且又是泛型时,当后续的代码依赖于传入的args中的每个元素的话,它是安全的。如果后续的代码依赖于args整体是T类型的数组的话,它将是不安全的。因为其中的元素可能是整型,也可能是字符串。程序会尝试将它转换成一个T类型的数组并且失败。
因此上面的两个方法中,前者是不安全的,后者是安全的。
在有些时候,开发者不希望看到这个“堆污染”的警告,那么就可以使用以下三种方式来抑制这个警告:
- 使用@SafeVarargs修饰引发该警告的方法或者构造器
- 使用@SuppressWarnings(“unchecked”)修饰。
- 编译时使用-Xlint:varargs选项
显然第三种方式很少用到,通常选择前两种,尤其是第一种,因为它是专门为抑制“堆污染”警告而提供的。
@FunctionalInterface
如果接口中只有一个抽象方法(可以包括多个默认方法或者多个static方法),该接口就是函数式接口。@FunctionalInterface就是用来指定某个接口必须是函数式接口的。
如果使用了@FunctionalInterface的接口不是函数式接口,那么编译就会出错。它和@Override一样,都是为了帮助程序员避免一些低级错误的。
Java五种基本的Annotation,提高程序的可读性的更多相关文章
- 1、如何在列表,字典,集合种根据条件筛选数据?2、如何为元组中的每个元素命名,提高程序的可读性3、如何统计出序列中元素出现的频度4、如何根据字典中value的大小,对字典的key进行排序
一.数据筛选: 处理方式: 1.filter函数在py3,返回的是个生成式. from random import randint data = [randint(-100,100) for i in ...
- Java五种单例区别
详细请参考如下链接: http://www.voidcn.com/article/p-shzgsluz-bqa.html https://blog.csdn.net/android_freshman/ ...
- python 学习笔记(二):为元组的每个元素命名,提高程序的可读性
在程序中有些数据为固定格式时,即字段数量确定.字段位置顺序确定不变,我们就可以用元组来储存.使用元组的优势是储存空间很小,访问速度也很快.如下代码对每个学生信息用元组来表示: # ('Jim', 16 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- java线程池与五种常用线程池策略使用与解析
背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...
- 【开发笔记】- Java读取properties文件的五种方式
原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- 改善C#程序,提高程序运行效率的50种方法
改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...
- Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
[请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...
随机推荐
- TDD:什么是桩(stub)和模拟(mock)?
背景 本文假设你对TDD.Stub和Mock已经有了初步的认识,本文简单解释一下stub和mock的区别和使用场景,先看看他们之间的关系: 由上图可以知道mock框架可以非常容易的开发stub和moc ...
- 包建强的培训课程(3):App竞品技术分析
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化
实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...
- [深入学习Web安全](11)之XSS玩法
[深入学习Web安全](11)之XSS玩法 本文转自:i春秋社区 前言这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下 ...
- 如何利用sqoop将hive数据导入导出数据到mysql
运行环境 centos 5.6 hadoop hive sqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具. 上海尚学堂 ...
- FFmpeg开发实战(一):FFmpeg 打印日志
在Visual Studio 开发(二):VS 2017配置FFmpeg开发环境一文中,我们配置好了FFmpeg的开发环境,下面我们开始边实战,边学习FFmpeg. 首先,我们要学习的就是FFmpeg ...
- Ubuntu16.04.1 安装Nginx
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...
- Kali学习笔记35:使用VBScript、PowerShell、DEBUG传输文件
其实VBScript只是一个工具 本质是开启http服务提供下载的 首先我们开启http服务:阿帕奇 然后给上传一个文件做演示: 接下来就是编写VBScript: 这些内容全部输入完成之后: 传输 早 ...
- TS - 解决问题的一些方法
How to resolve the problem? 获取基本的相关信息(后续处理问题的基础) 在怎样的背景环境下?发生了怎样的问题? 如果无法清楚地辨别或陈述问题的基本信息,那么,此时要面对的将 ...
- python高级-模块(14)
一.python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的. ...