前言
枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或者多个接口,也可以定义自己的构造器。在JDK1.5开始增加了关键字 enum(它与关键字 class ,interface 处于同等位置)用来定义枚举类型。
关键字:enum (class interface )
个人感觉枚举用的范围比较小,可能是境界不够hahahaha
下面我通过学生类的sex(性别)属性慢慢引出枚举!
一、方法一
第一种方式:setSex()方法进行通过代码判断
public void setSex(String sex) {
//限制 通过逻辑代码实现
if("男".equals(sex) ||"女".equals(sex) ){
this.sex = sex;
}else{
throw new RuntimeException("性别只能是男或者女,不能是:"+sex);
}
}
缺点:
1) 编写逻辑代码: if--else
2) 检查是在代码运行的时候,才会判断
二、方法二
第二种方式: 男,女作为一个常量, 要求给sex属性赋值, 把常量赋值给sex属性
public class Student {
//定义男女的两个常量
public static final String MAN = "男";
public static final String WOMAN = "女";
}
stu.setSex(Student.MAN);
> 经验:
>
> 开发过程中, 善用常量: 避免"魔法数字" ,可读性
>使用常量缺点:
>
>1) 无法检查, 很弱的限制, 口头限制,代码无法限制
>
>好处: 可读性高
三、方法三
使用私有构造方法, 提供两个公开静态的本类对象, 显示这个类的对象个数
/**
* 性别类,
* 使用对象, sex 只有 两个对象: 男的对象 ,女的对象
*/
public class Sex {
//Sex定义两个常量, 本类的对象
public static final Sex MAN = new Sex();
public static final Sex WOMAN = new Sex();
//私有的构造方法 表示这个构造方法只能在本类使用
private Sex(){
}
//提供公开的静态方法, 调用本类的构造方法,创建一个对象,返回
//public static Sex createInstance(){
// return new Sex();
//}
}
偷懒:
public static final 类 省略: MAN ,WOMAN MAN 等同于: public static final Sex MAN = new Sex();
构造方法默认就是private修饰
public enum Sex{
MAN,WOMAN
}
JDK 为了简化上面的代码. 提供 enum (枚举) , 还是一个类
/**
* 枚举
* 如果一个类的对象有限个数, 列举出来,使用枚举
*/
public enum SexEnum {
MAN,WOMAN
}
1.enum和class、interface的地位一样
2.使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
3.枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
4.使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
5.枚举类的构造器只能是私有的。
枚举类的父类java.lang.Enum: 父类有两个属性:
1) name: 枚举的对象的名字, name() 获取对象名字
2) ordinal: 枚举对象下标 ordinal() 获取对象的下标
枚举使用场景: 某个类的对象有限个数, 需要列举出来, 可以使用枚举
比如: 季节类: 春夏秋冬 季节类定义枚举
演示
1.手动枚举
public class EnumDemo {
public static final int SPRING = 1;//春
public static final int SUMMER = 2;//夏
public static final int FALL = 3;//秋
public static final int WINTER = 4;//冬
public static void main(String[] args) {
showSeason(SPRING);
}
public static void showSeason(int season)) {
switch (season) {
case SPRING:
System.out.println("春季");
break;
case SUMMER:
System.out.println("夏季");
break;
case FALL:
System.out.println("秋季");
break;
case WINTER:
System.out.println("冬季");
break;
default:
System.out.println("未知数据");
}
}
}
2.jdk中的枚举类
1). 定义枚举类型Sex:预定义实例BOY表示男,GIRL表示女
public enum Sex{
BOY,GIRL;
}
2). 定义Person类型含有姓名和性别属性,姓名使用字符串类型,性别使用Sex枚举类型类型
class Person{
String name;
Sex sex;//sex只能是 Sex.BOY或者Sex.GIRL中的一个值
public Person(String name, Sex sex) {
this.name = name;
this.sex = sex;
}
}
3). 定义测试类设置性别时只能使用传入枚举中的固定值
public class Demo01 {
public static void main(String[] args) {
Person p1 = new Person("张三",Sex.BOY);
Person p2 = new Person("李四",Sex.GIRL);
Person p3 = new Person("塞班",Sex.YAO);
}
}
//性别的枚举类型
enum Sex{
BOY,GIRL, YAO
}
class Person{
private String name;
private Sex sex;
public Person() {
}
public Person(String name, Sex sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
}