一、问题:创建季节(Season)对象,请设计完成?
分析:创建季节对象有如下特点:
- 季节的值是有限的几个值(spring,summer,autumn,winter)
- 只读,不需要修改
二、解决方案--枚举
枚举的特点:
- 枚举是一组常量的集合
- 枚举属于一种特殊的类,里面只包含一组有限的特定对象
- 构造器私有化
- 对外暴露对象
- 可以提供get方法,但是不能提供set方法
枚举的实现方式
A、自定义实现枚举
查看代码
//枚举类实现
class Season {
private String name;
private String desc;
//在Season内部创建固定的对象
public static Season SPRING = new Season("春天", "温暖");
public static Season WINNER = new Season("冬天", "寒冷");
public static Season AUTUMN = new Season("秋天", "凉爽");
public static Season SUMMER = new Season("夏天", "炎热");
//构造器私有化,防止直接new
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
//只设置get方法,防止属性被修改
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
- 使用关键字enum替代class
- 语法格式:常量名(参数列表)
- 如果有多个常量对象,对象之间用逗号即可
- 常量对象写在最前面
查看代码
//枚举类实现
enum Season {
SPRING("春天", "温暖"),
WINNER("冬天", "寒冷"),
AUTUMN("秋天", "凉爽"),
SUMMER("夏天", "炎热");
private String name;
private String desc;
//构造器私有化,防止直接new
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
//只设置get方法,防止属性被修改
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
三、枚举常用方法
查看代码
public static void main(String[] args) {
Season autumn = Season.AUTUMN;
//name():输出枚举对象的名称
System.out.println(autumn.name());
//ordinal():输出枚举对象的编号,编号从0开始
System.out.println(autumn.ordinal());
//values():枚举对象的数组
Season[] seasons = Season.values();
for (int i = 0; i < seasons.length; i++) {
System.out.println(seasons[i]);
}
//valueOf():将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
Season autumn1 = Season.valueOf("AUTUMN");
System.out.println(autumn1);
// compareTo:返回两个枚举常量的编号差
System.out.println(Season.AUTUMN.compareTo(Season.WINNER));
}
四、枚举使用细节
- 使用enum关键字后,不能再继承其他类
- enum实现枚举类后,仍然是可以实现接口的