一、引出枚举类
1.先看一个需求demo
package com.hspedu.enum_;
public class Enumration01 {
public static void main(String[] args) {
Season Spring = new Season("春天", "温暖");
Season Summer = new Season("夏天", "炎热");
Season Autumn = new Season("秋天", "潮湿");
Season Winter = new Season("冬天", "寒冷");
//对于季节来说,他的对象是固定的四个不会有更多,如果按照这个设计类的思路,不能体现季节是固定的四个对象。
// 因此这样的设计不好
Autumn.setName("XXX");
Autumn.setDesc("hahaha");
//可以引出枚举类,把具体的对象一个一个列举出来的类
//称为枚举类
}
}
class Season {
private String name;
private String desc;//描述
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.创建Season对象有如下的特点:
1).季节的值是有限的几个值(spring,summer,autumn。wiinter)
2).只读,不需要修改
3.解决方案-枚举
1)枚举对应英文enumeration
2)枚举是一组常量的集合
3)枚举是一种特殊的类,里面只包含一组有限的特定的对象
4.枚举的两种实现方式
1.自定义类实现枚举
package com.hspedu.enum_;
public class Enumration02 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
//演示自定义枚举实现
//1.构造器私有化,防止直接被new出来
//2.把setXXX相关方法去掉,防止属性被修改
//3.在Season内部,直接创建固定的对象
//4.可以加一个final,final+static可以跳过类加载,调用final+ static的变量,你不可能去修改,可以不需要类加载,底层优化,避免了类加载
//补充:这里出现了误会,去看了前面的final关键字。其实这里并没有跳过类加载,因为它new了一定会进行类加载,这里只是想说明常量不能修改
class Season {
private String name;
private String desc;//描述
//定义了四个对象
public final static Season SPRING = new Season("春天","温暖");//常量必须大写规范
public final static Season SUMMEE = new Season("夏天","炎热");
public final static Season AUTUMN = new Season("秋天","潮湿");
public final static Season WINTER = new Season("冬天","寒冷");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getDesc() {
return desc;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
2. 使用关键字enum实现类加载
package com.hspedu.enum_;
public class Enumeration3 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
System.out.println(Season2.SUMMER);
}
}
//演示关键字实现枚举
enum Season2 {
//定义了四个对象
// public final static Season2 SPRING = new Season2("春天","温暖");//常量必须大写规范
// public final static Season2 SUMMEE = new Season2("夏天","炎热");
// public final static Season2 AUTUMN = new Season2("秋天","潮湿");
// public final static Season2 WINTER = new Season2("冬天","寒冷");
//如果使用enum来实现枚举类
//1.使用关键字替代class
//2.public final static Season2 SPRING = new Season2("春天","温暖");直接使用 SPRING("春天","温暖");
//其实格式就是常量名(SPRING)+传给构造器的参数(("春天","温暖"))
//3.如果有多个常量(对象),使用逗号间隔即可
//4.如果使用enum实现枚举。要求定义的常量对象写在最前面
SPRING("春天","温暖"),Winter("冬天","寒冷"),SUMMER("夏天","炎热"),AUTUMN("秋天","潮湿");
private String name;
private String desc;//描述
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getDesc() {
return desc;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}