Java枚举类
Java枚举类
笙沉一、枚举类
1、使用场景
- 当类的对象只有有限个,如:
- 周一到周五:Monday,……,Sunday
- 一年的四个季节:Spring,Summer,Autumn,Winter
- 订单状态:未付款,已付款,已配送,已发货,退货,已确认
- 线程状态:创建,就绪,销毁,运行,阻塞,死亡
- 当需要定义一组常量时,建议使用枚举类。
2、枚举类的定义
JDk5.0以后,可以使用enum关键字定义枚举类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public enum Season {
//定义枚举类对象,中间用","隔开
SPRING("春天","很温暖"),
SUMMER("夏天","很炎热"),
AUTUMN("秋天","很凉爽"),
WINTER("冬天","很寒冷");
//声明Season属性
private final String name;
private final String desc;
//构造方法只能是私有
private Season(String name,String desc){
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}1
2
3
4
5
6
7
8
9//使用枚举类
public void test1() {
Season spring = Season.SPRING;
System.out.println(spring);
//输出:SPRING,并没有输出地址,说明父类不是Object
System.out.println(Season.class.getSuperclass());//父类是:java.lang.Enum
}父类Enum类的常用方法:
values()
:返回枚举类的对象数组,该方法可以很方便遍历所有枚举值valueOf(String str)
:可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举对象名字,否则会有异常:IllegalArgumentException.toString()
:返回当前枚举类对象常量的名称。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void test2() {
Season spring = Season.SPRING;
//toString()方法
System.out.println(spring.toString()); //SPRING
//values()方法
Season[] values = Season.values();
for (Season value : values) {
System.out.println(value);
}
/* SPRING
SUMMER
AUTUMN
WINTER*/
//valueOf()方法
Season winter = Season.valueOf("WINTER");//如果没找到会有异常IllegalArgumentException
System.out.println(winter);//WINTER
}
3、枚举类实现接口
情况一:和普通类没区别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32//一个接口
interface Info{
void show();
}
//枚举类实现接口
public enum Season implements Info{
SPRING("春天","很温暖"),
SUMMER("夏天","很炎热"),
AUTUMN("秋天","很凉爽"),
WINTER("冬天","很寒冷");
private final String name;
private final String desc;
private Season(String name,String desc){
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
//实现接口方法
public void show() {
System.out.println("一个季节");
}
}1
2
3
4
5
public void test2() {
Season spring = Season.SPRING;
spring.show(); //一个季节
}情况二:针对每个对象,都各自实现接口的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49//一个接口
interface Info{
void show();
}
//枚举类实现接口
public enum Season implements Info{
//每个枚举对象各自实现接口方法
SPRING("春天","很温暖"){
public void show() {
System.out.println("这是春天");
}
},
SUMMER("夏天","很炎热"){
public void show() {
System.out.println("这是夏天");
}
},
AUTUMN("秋天","很凉爽"){
public void show() {
System.out.println("这是秋天");
}
},
WINTER("冬天","很寒冷"){
public void show() {
System.out.println("这是冬天");
}
};
private final String name;
private final String desc;
private Season(String name,String desc){
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
public void test2() {
Season[] values = Season.values();
for (Season value : values) {
value.show();
}
}
/*
这是春天
这是夏天
这是秋天
这是冬天
*/
二、注解
注解的常见作用:
- 生成相关的文档。
- 在编译时进行格式检查,如:
- @Override:限定重写父类的方法,该注解只可用于方法;
- @Deprecated:用于表示修饰的类或方法已过时;
- @SuppressWarnings:抑制编译器警告;
- 跟踪代码依赖性,实现替代配置文件的效果(框架常用)。
自定义注解
- 注解声明为@interface。
- 内部定义成员,通常是value。
- 可以指定默认值,使用default定义默认值。
- 如果注解里面没有成员,说明只是起到标记作用。
- 如果注解有成员,使用时现需要指明其值。
- 自定义注解必须配上注解的信息处理流(使用反射)才有意义。
1
2
3
4
5
6
7
8
9
10
11//注解定义(暂无意义)
public MyAnnotation {
//内部成员
String value();
}
//注解使用
class MyClass{
}