了解枚举
问题
声明一个学生类,包含学号、姓名、性别字段,其中性别字段定义成枚举类型。
分析
定义一个变量来表示性别的分类?请问该变量的类型使用什么?
使用int和String类型,且先假设使用int类型,因为分类情况是固定的,为了防止调用者乱创建类型,可
以把三种情况使用常量来表示。常量使用final修饰,并且使用大写字母组成,如果是多个单词组成,使用下划线分割。此时调用setSex方法传递的值应该是Sex类中三个常量之一。但是此时依然存在一个问题——依然可以乱传入参数比如100,此时就不合理了。
同理如果使用String类型,还是可以乱设置数据。那么说明使用int或String是类型不安全的。那么如果
使用对象来表示三种情况呢?
public class Sex{
public static final Sex MEN = new Sex();
public static final Sex WOMEN = new Sex();
public static final Sex NEUTRAL = new Sex();
private Sex() {}
}
此时为了防止调用者私自创建出新的对象,我们把Sex的构造器私有化起来,外界就访问不了
了,此时调用setSex方法只能传入Sex类中的三个常量
枚举是一种特殊的类,专门用于声明可罗列的常量值,定义格式:
public enum 枚举类名{
常量对象A,----逗号
常量对象B,
常量对象C; ----分号
}
枚举中都是全局公共的静态常量,可以直接使用枚举类名调用。
解答
public class Student {
private String id,name;
private SexEnum sexEnum;
public Student(String id, String name, SexEnum sexEnum) { //有参构造
this.id = id;
this.name = name;
this.sexEnum = sexEnum;
}
public String getId() { //getter and setter
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SexEnum getSexEnum() {
return sexEnum;
}
public void setSexEnum(SexEnum sexEnum) {
this.sexEnum = sexEnum;
}
@Override
public String toString() { //重写toString
return "Student{" +
"id='" + id + ''' +
", name='" + name + ''' +
", sexEnum=" + sexEnum +
'}';
}
}
public enum SexEnum { //枚举声明性别变量
男,
女,
保密;
}
我们自定义的枚举类在底层都是直接继承了java.lang.Enum类的
public class EnumDemo {
public static void main(String[] args) {
Student student1 = new Student("1001","张三", SexEnum.男);
String str = student1.toString();//枚举中都是全局公共的静态常量,可以直接使用枚举类名调用
System.out.println(str);
}
}
java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法.
int ordinal = 枚举对象.ordinal(); // 返回枚举对象的序号,从0开始
注意:枚举类不能使用创建对象



