枚举 & 注解 & 反射
一、枚举
在JDK1.5之前,定义常量一般为:public stattic final…,很难管理。
JDK1.5引入了枚举。
枚举可以把相关常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
用于定义有限数量的一组同类常量,例如:
错误等级:低、中、高、急
一年的四季:春、夏、秋、冬
商品的类型:美妆、手机、电脑、男装、女装
在枚举类型中定义的常量是该枚举类型的实例。
1.1 定义格式
权限修饰符 enum 枚举名称{
实例1,实例2,实例3,实例4;
}
如:
public enum Level{
LOW(30),MEDIUM(15),HIGH(7),URGENT(1);
private int levelValue;
private Level(int levelValue) {
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
}
1.2 主要方法
Enum抽象类常见方法
Enum是所有Java语言枚举类型的公共基本类(注意Enum是抽象类),以下是其常见方法:
返回类型 | 方法名称 | 方法说明 |
---|---|---|
int | compareTo(E 0) | 比较此枚举与指定对象的顺序 |
boolean | equals(Object other) | 当指定对象等于此枚举常量时,返回true |
Class<?> | getDeclaringClass() | 返回与此枚举常量的枚举类型相对应的Class对象 |
String | name() | 返回此枚举常量的名称,在其枚举声明中对其进行申明 |
int | ordinal() | 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) |
String | toString() | 返回枚举常量的名称,它包含在声明中 |
Static<T extends Enum> T | static valueOf(class enumType,String name) | 返回带指定名称的指定枚举类型的枚举常量 |
1.3 实现接口的枚举类
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
每个枚举对象,都可以实现自己的抽象方法
public interface LShow{
void show();
}
public enum Level implements LShow{
LOW(30){
@Override
public void show(){
//...
}
}, MEDIUM(15){
@Override
public void show(){
//...
}
},HIGH(7){
@Override
public void show(){
//...
}
},URGENT(1){
@Override
public void show(){
//...
}
};
private int levelValue;
private Level(int levelValue) {
this.levelValue = levelValue;
}
public int getLevelValue() {
return levelValue;
}
}
1.4 注意事项
-
一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。
-
枚举类默认继承的是java.lang.Enum类而不是Object类
-
枚举类不能有子类,因为其枚举类默认被fifinal修饰
-
只能有private构造方法
-
switch中使用枚举时,直接使用常量名,不用携带类名
-
不能定义name属性,因为自带name属性
-
不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。
二、 注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
- 主要用于:
- 编译格式检查
- 反射中解析
- 生成帮助文档
- 跟踪代码依赖
2.1 内置注解
-
@Override : 重写
- 定义在java.lang.Override
-
@Deprecated:废弃
- 定义在java.lang.Deprecated
-
@SafeVarargs
- Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
-
@FunctionalInterface: 函数式接口
- Java 8 开始支持,标识一个匿名函数或函数式接口。
-
@Repeatable:标识某注解可以在同一个声明上使用多次
- Java 8 开始支持,标识某注解可以在同一个声明上使用多次
-
SuppressWarnings:抑制编译时的警告信息。
- 定义在java.lang.SuppressWarnings
- 三种使用方式
1. @SuppressWarnings("unchecked") [^ 抑制单类型的警告] 2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告] 3. @SuppressWarnings("all") [^ 抑制所有类型的警告]
参数列表:
关键字 用途 all 抑制所有警告 boxing 抑制装箱、拆箱操作时候的警告 cast 抑制映射相关的警告 dep-ann 抑制启用注释的警告 deprecation 抑制过期方法警告 fallthrough 抑制switch中缺失breaks的警告 finally 抑制finally模块没有返回的警告 hiding 抑制相对于隐藏变量的局部变量的警告 incomplete-switch 忽略没有完整的switch语句 nls 忽略非nls格式的字符 null 忽略对null的操作 rawtypes 使用generics时忽略没有指定相应的类型 restriction 抑制禁止使用劝阻或禁止引用的警告 serial 忽略在serializable类中没有声明serialVersionUID变量 static-access 抑制不正确的静态访问方式警告 synthetic-access 抑制子类没有按最优方法访问内部类的警告 uncheched 抑制没有进行类型检查操作的警告 unqualified-field-access 抑制没有权限访问的域的警告 unused 抑制没被使用过的代码的警告
2.2 元注解
元注解是作用在其他注解的注解
类型:
(1)@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
(2)@Documented - 标记这些注解是否包含在用户文档中 javadoc。
(3)@Target - 标记这个注解应该是哪种 Java 成员。
(4)@Inherited - 标记这个注解是自动继承的
- a. 子类会继承父类使用的注解中被@Inherited修饰的注解
b. 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
c. 类实现接口时不会继承任何接口中定义的注解