源码分享: github.com/ddb12138/ju…
Enum枚举类
啥时候使用枚举类?
- 定义一组常量时,强烈建议使用枚举类
- 类的对象有确定个数
- 类的对象不变
- 方式一:jdk 5.0之前,自定义枚举类
- 方式二:jkd 5.0时,可以使用enum关键字定义枚举类
自定义枚举类
三个要求
- private final 来修饰的成员变量,符合使用枚举类的要求
- 私有化构造器,确保对象个数确定
- 通过public static final 修饰常量值,可以通过类.常量直接访问
//自定义注解类
public class CustomEnum {
private final String seasonName; //类的成员变量不变
private final String seasonDesc;
private CustomEnum(String seasonName,String seasonDesc){ //构造器私有化
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public static final CustomEnum SPRING = new CustomEnum("春天","春暖花开"); //static final值无法被修改
public static final CustomEnum SUMMER = new CustomEnum("夏天","炎炎夏日");
public static final CustomEnum AUTUMN = new CustomEnum("秋天","秋高气爽");
public static final CustomEnum WINTER = new CustomEnum("冬天", "凛冬来袭");
//可以重写toString方法或者添加get,set方法
@Override
public String toString() {
return "CustomEnum{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
public static void main(String[] args) {
System.out.println(CustomEnum.AUTUMN);
//输出: CustomEnum{seasonName='秋天', seasonDesc='秋高气爽'}
}
}
Enum关键字
看完自定义枚举类,看一下jkd 5.0添加的Enum类
package enumdemo;
//首先于上面自定义的class类很相似,只不过抽离了一些固定的前缀如public static final
enum Season {
//public static final Seasons SPINRG = new Seasons("春天", "四季如春");
//反正public static final 类名是固定的,还有new 类名也是固定的,不如去掉,然后多个值之间用逗号分开,结束用分号,其余不变
SPRING("春天", "四季如春"),
SUMMER("夏天", "热的不行"),
AUTUMN("秋天", "凉风飒飒"),
WINTER("冬天", "冰天雪地");
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//可以添加其他诉求比如get方法、toString方法....
public static void main(String[] args) {
System.out.println(Season.SPRING);
// 输出 SPRING
}
}
为什么输出SPRING?
System.out.println(Season.class.getSuperclass());
//输出 : class java.lang.Enum
//可以看出是使用了父类的toString方法,所以可以进行重写,下面是父类的一些信息
Enum类
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
/**
* The name of this enum constant, as declared in the enum declaration.
* Most programmers should use the {@link #toString} method rather than
* accessing this field.
*/
private final String name;
public String toString() {
return name;
}
常用方法
values获取所有对象 valueof获取指定对象 toString打印对象
public class enumtest {
public static void main(String[] args) {
System.out.println(Season.AUTUMN); //未重写toString
System.out.println("***********");
Season[] values = Season.values(); //values
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
System.out.println("***********");
Season value = Season.valueOf("SPRING"); //如果不存在则会报Exception
System.out.println(value);
Season value1 = Season.valueOf("XXXX");
System.out.println(value1);
}
}
输出:
AUTUMN
***********
SPRING
SUMMER
AUTUMN
WINTER
***********
SPRING
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant enumdemo.Season.XXXX
与接口搭配使用
//接口,实现不同的enum对象有不同的实现方法
interface interfaceDemo {
void sayHello();
}
//enum类
enum SeasonNew implements interfaceDemo{
SPRING("春天", "四季如春"),
SUMMER("夏天", "热的不行");
private final String seasonName;
private final String seasonDesc;
private SeasonNew(String name,String desc){
this.seasonName=name;
this.seasonDesc=desc;
}
@Override
public void sayHello() {
System.out.println("春天到了");
}
public static void main(String[] args) {
SeasonNew.SPRING.sayHello();
SeasonNew.SUMMER.sayHello();
}
}
//输出:
//春天到了
//春天到了
修改版本
enum SeasonInterface implements interfaceDemo {
SPRING("春天", "四季如春"){
@Override
public void sayHello() {
System.out.println("春天到了");
}
},
SUMMER("夏天", "热的不行"){
@Override
public void sayHello() {
System.out.println("夏天到了");
}
};
private final String seasonName;
private final String seasonDesc;
private SeasonInterface(String name,String desc){
this.seasonName=name;
this.seasonDesc=desc;
}
public static void main(String[] args) {
SeasonInterface.SPRING.sayHello();
SeasonInterface.SUMMER.sayHello();
}
}
输出:
春天到了
夏天到了