Java基础(十)——枚举与注解
一、枚举
1、介绍
枚举类:类的对象只有有限个,确定的。当需要定义一组常量时,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现。
使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类。
2、枚举的实现
代码示例:方式一,JDK 5.0 之前,自定义枚举类
1 public class SeasonEnum {
2
3 // 枚举当前类的多个对象
4 public static final SeasonEnum SPRING = new SeasonEnum("01", "春天");
5 public static final SeasonEnum SUMMER = new SeasonEnum("02", "夏天");
6 public static final SeasonEnum AUTUMN = new SeasonEnum("03", "秋天");
7 public static final SeasonEnum WINTER = new SeasonEnum("04", "冬天");
8
9 private SeasonEnum(String code, String desc) {
10 this.code = code;
11 this.desc = desc;
12 }
13
14 private final String code;
15 private final String desc;
16
17 public String getCode() {
18 return code;
19 }
20
21 public String getDesc() {
22 return desc;
23 }
24 }
代码示例:方式二,JDK 5.0,可以使用 enum 关键字定义枚举
1 public enum SeasonEnum {
2
3 // 枚举当前类的多个对象
4 SPRING("01", "春天"),
5 SUMMER("02", "夏天"),
6 AUTUMN("03", "秋天"),
7 WINTER("04", "冬天");
8
9 public static final Map<String, SeasonEnum> map = new HashMap<>();
10
11 static {
12 for (SeasonEnum e : values()) {
13 map.put(e.code, e);
14 }
15 }
16
17 SeasonEnum(String code, String desc) {
18 this.code = code;
19 this.desc = desc;
20 }
21
22 private final String code;
23 private final String desc;
24
25 public String getCode() {
26 return code;
27 }
28
29 public String getDesc() {
30 return desc;
31 }
32
33 }
3、枚举实现接口
1 public enum SeasonEnum implements Info {
2
3 // 枚举当前类的多个对象
4 SPRING("01", "春天") {
5 @Override
6 public void show() {
7 System.out.println("春暖花开");
8 }
9 },
10 SUMMER("02", "夏天") {
11 @Override
12 public void show() {
13 System.out.println("夏日炎炎");
14 }
15 },
16 AUTUMN("03", "秋天"),
17 WINTER("04", "冬天");
18
19 SeasonEnum(String code, String desc) {
20 this.code = code;
21 this.desc = desc;
22 }
23
24 private final String code;
25 private final String desc;
26
27 public String getCode() {
28 return code;
29 }
30
31 public String getDesc() {
32 return desc;
33 }
34
35 public void show() {
36 System.out.println("我的天气");
37 }
38
39 }
40
41 interface Info {
42 void show();
43 }
4、API
values()方法:返回所有的枚举类型的对象。
valueOf(String str):检查该字符串是不是枚举类对象的"名字"。如不是,会有运行时异常:IllegalArgumentException。
toString():返回当前枚举类对象常量的名称。
二、注解
1、介绍
从 JDK 5.0 开始,Java 增加了对元数据(MetaData)的支持,也就是Annotation(注解)。
Annotation 其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
一定程度上,可以说:框架 = 注解 + 反射 + 设计模式。
2、示例
示例一、生成文档相关
@author:标明开发该类模块的作者,多个作者之间使用,分割。
@version:标明该类模块的版本。
@see:参考转向,也就是相关主题。
@since:从哪个版本开始增加的。
@param:对方法中某参数的说明,如果没有参数就不能写。
@return:对方法返回值的说明,如果方法的返回值类型是void就不能写。
@exception:对方法可能抛出的异常进行说明,如果方法没有用throws显式抛出的异常就不能写。
示例二、在编译时进行格式检查(JDK内置的三个基本注解)
@Override:限定重写父类方法,该注解只能用于方法。
@Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择。
@SuppressWarnings:抑制编译器警告。
3、自定义注解
代码示例:
1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE, ElementType.FIELD})
3 public @interface MyAnnotation {
4 String value() default "baidu";
5 }
6
7 @MyAnnotation()
8 public class Person {
9 }
10
11 public class Main {
12 public static void main(String[] args) {
13 // 通过反射获取Person类的注解
14 Class<Person> clazz = Person.class;
15 MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
16
17 // 获取注解的值
18 String value = annotation.value();
19 System.out.println(value); // baidu(输出了默认值)
20 }
21 }
4、元注解
JDK 的元注解用于修饰其他注解定义。除了上面自定义注解用到的两个,JDK5.0提供了4个标准的元注解,分别是:@Documented、@Inherited、@Retention、@Target。
@Retention:用于指定注解的生命周期,它包含一个RetentionPolicy枚举类型的成员变量。
源码示例:
1 @Documented
2 @Retention(RetentionPolicy.RUNTIME)
3 @Target(ElementType.ANNOTATION_TYPE)
4 public @interface Retention {
5 /**
6 * Returns the retention policy.
7 * @return the retention policy
8 */
9 RetentionPolicy value();
10 }
11
12 public enum RetentionPolicy {
13 /**
14 * Annotations are to be discarded by the compiler.
15 */
16 SOURCE,
17
18 /**
19 * Annotations are to be recorded in the class file by the compiler
20 * but need not be retained by the VM at run time. This is the default
21 * behavior.
22 */
23 CLASS,
24
25 /**
26 * Annotations are to be recorded in the class file by the compiler and
27 * retained by the VM at run time, so they may be read reflectively.
28 *
29 * @see java.lang.reflect.AnnotatedElement
30 */
31 RUNTIME
32 }
源码中的英文注释写的很清楚,下面翻译一下:
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。
RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行 Java 程序时,JVM不会保留注解。这是默认值。
RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java 程序时,JVM 会保留注释。只有声明为RUNTIME生命周期的注解,才可以通过反射获取该注释。
@Target:用于指定注解能用于修饰哪些程序元素,它包含一个ElementType枚举类型的成员变量。
源码示例:
1 @Documented
2 @Retention(RetentionPolicy.RUNTIME)
3 @Target(ElementType.ANNOTATION_TYPE)
4 public @interface Target {
5 ElementType[] value();
6 }
7
8 public enum ElementType {
9 // 用于修饰类、接口,或者enum声明
10 /** Class, interface (including annotation type), or enum declaration */
11 TYPE,
12
13 // 用于修饰域
14 /** Field declaration (includes enum constants) */
15 FIELD,
16
17 // 用于修饰方法
18 /** Method declaration */
19 METHOD,
20
21 // 用于修饰参数
22 /** Formal parameter declaration */
23 PARAMETER,
24
25 // 用于修饰构造器
26 /** Constructor declaration */
27 CONSTRUCTOR,
28
29 // 用于修饰局部变量
30 /** Local variable declaration */
31 LOCAL_VARIABLE,
32
33 // 用于修饰注解
34 /** Annotation type declaration */
35 ANNOTATION_TYPE,
36
37 // 用于修饰包
38 /** Package declaration */
39 PACKAGE,
40
41 /**
42 * Type parameter declaration
43 *
44 * @since 1.8
45 */
46 TYPE_PARAMETER,
47
48 /**
49 * Use of a type
50 *
51 * @since 1.8
52 */
53 TYPE_USE
54 }
@Documented:用于指定被该注解修饰的类将被 javadoc 工具提取成文档。默认情况下,javadoc是不包括注解的。定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited:被它修饰的注解将具有继承性。如果某个类使用了被@Inherited 修饰的注解,则其子类将自动具有该注解。
三、JDK8的新特性
1、介绍
Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。此外,反射也得到了加强,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解。
2、可重复注解
代码示例:方式一,JDK8之前
1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE})
3 public @interface MyAnnotation {
4 String value() default "baidu";
5 }
6
7 @Retention(RetentionPolicy.RUNTIME)
8 @Target({ElementType.TYPE})
9 public @interface MyAnnotations {
10 MyAnnotation[] value();
11 }
12
13 //@MyAnnotation("xiaoming")
14 //@MyAnnotation("xiaohong")
15 @MyAnnotations({@MyAnnotation("xiaoming"), @MyAnnotation("xiaohong")})
16 public class Person {
17 private int age;
18
19 public void say() {
20 }
21 }
代码示例:方式二,JDK8之后
1 // 注:MyAnnotation的Target和Retention等元注解须与MyAnnotations相同
2 @Repeatable(MyAnnotations.class)
3 @Retention(RetentionPolicy.RUNTIME)
4 @Target({ElementType.TYPE})
5 public @interface MyAnnotation {
6 String value() default "baidu";
7 }
8
9 @Retention(RetentionPolicy.RUNTIME)
10 @Target({ElementType.TYPE})
11 public @interface MyAnnotations {
12 MyAnnotation[] value();
13 }
14
15 @MyAnnotation("xiaoming")
16 @MyAnnotation("xiaohong")
17 public class Person {
18 private int age;
19
20 public void say() {
21 }
22 }
3、类型注解
在Java 8之前,注解只能在声明的地方使用。Java8开始,注解可以应用在任何地方。
ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中(如:泛型声明)。
ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。
代码示例:TYPE_PARAMETER
1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE, ElementType.TYPE_PARAMETER})
3 public @interface MyAnnotation {
4 String value() default "baidu";
5 }
6
7 @MyAnnotation
8 public class Person<@MyAnnotation T> {
9 private T age;
10
11 public void say() throws RuntimeException {
12 List<String> list = new ArrayList<>();
13
14 int num = (int) 10L;
15 }
16 }
代码示例:TYPE_USE
1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({ElementType.TYPE, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
3 public @interface MyAnnotation {
4 String value() default "baidu";
5 }
6
7 @MyAnnotation
8 public class Person<@MyAnnotation T> {
9 private T age;
10
11 public void say() throws @MyAnnotation RuntimeException {
12 List<@MyAnnotation String> list = new ArrayList<>();
13
14 int num = (@MyAnnotation int) 10L;
15 }
16 }
Java基础(十)——枚举与注解的更多相关文章
- 【Java基础】枚举和注解
在Java1.5版本中,引入了两个类型:枚举类型enum type和注解类型annotation type. Num1:用enum代替int常量 枚举类型enum type是指由一组固定的常量组成合法 ...
- java基础解析系列(六)---注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...
- Java基础之枚举
Java基础之枚举 作为1.5才增加的特性,枚举的使用并不是很多. 枚举其实就是一个比较特殊的类,就如同注解其实也是个特殊的接口一样(注解反编译之后没有了@符号).枚举使用enum关键字声明,通过反编 ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- 黑马程序员:Java基础总结----枚举
黑马程序员:Java基础总结 枚举 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 枚举 为什么要有枚举 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别 ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
- Java基础之枚举类型Enum的使用
Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...
- Java基础加强总结(一)——注解(Annotation)
一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...
- 夯实Java基础(十七)——注解(Annotation)
1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...
随机推荐
- js 让小数四舍五入保留两位小数的函数是?
js 让小数四舍五入保留两位小数的函数是? 例子:data.relations[i].data[j].toFixed(2) toFixed(2)这个函数就是保留两位小数的作用
- Libevent使用例子
初等: 客户端代码: #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #in ...
- 优雅的按键模块-----Multi-button
优雅的按键模块-----Multi-button 在我们日常开发和使用的过程中常常使用了一些按键,利用按键实现不同的功能,比如长按,短按,双击等等.但是每次都是采用标志等等来实现信息的读取,是否有 ...
- C++基础之虚析构函数原理
结论 虚函数表指针 + 虚函数表 共同实现 演示 VS2017(32位) 基类有析虚构函数 一段代码演示 #include <iostream> #include <memory&g ...
- 【九度OJ】题目1196:成绩排序 解题报告
[九度OJ]题目1196:成绩排序 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1196 题目描述: 用一维数组存储学号和成绩,然后 ...
- 【LeetCode】98. Validate Binary Search Tree 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 BST的中序遍历是有序的 日期 题目地址:ht ...
- Andrey and Problem
B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- 如何让 Spring Security 「少管闲事」
记两种让 Spring Security「少管闲事」的方法. 遇到问题 一个应用对外提供 Rest 接口,接口的访问认证通过 Spring Security OAuth2 控制,token 形式为 J ...
- 「算法笔记」数位 DP
一.关于数位 dp 有时候我们会遇到某类问题,它所统计的对象具有某些性质,答案在限制/贡献上与统计对象的数位之间有着密切的关系,有可能是数位之间联系的形式,也有可能是数位之间相互独立的形式.(如求满足 ...
- IOS 如何获取app更新链接 如【itms-apps://itunes.apple.com/cn/app/id1362432761?mt=8】
这是iTunes接口地址 ,有兴趣可以看一下,我们要用到的接口如下,xxx 处换成自己 App 的 AppId ,AppId 可以在 iTunes Connect 里面看到. http://itune ...