比如对于一个学生类,存在性别属性: (男,女)
他的值是有穷的,故我们可以列举出他的全部可能性:
下面是几种实现判断输入是否为男或女的方法:
第一种方式: 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("女"); }
//提供了有参的构造方法 默认访问修饰符: private,只能是private SexEnum(String value){ this.value = value; }
在测试类中:(注意不能new一个枚举的对象,因为它的构造方法为私有)
使用枚举类的方法:
1)重写学生类的构造方法:在new时完成初始化
代码如下:
学生类中:
public Student2(SexEnum sex) { this.sex = sex; }
测试类中:
Student2 student2 = new Student2(MAN);
2)使用无参构造方法后用对象的set方法:
代码如下:
Student2 student2 = new Student2(); student2.setSex(MAN);
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() 获取对象的下标
枚举使用场景: 某个类的对象有限个数, 需要列举出来, 可以使用枚举
比如: 季节类: 春夏秋冬 季节类定义枚举