enum SeasonEnum //这是一个枚举类,有四个枚举值 { SPRING,SUMMER,FALL,WINTER; } public class EnumTest { public void judge(SeasonEnum s) { switch(s) { case SPRING: System.out.println("春天"); break; case SUMMER: System.out.println("夏天"); break; case FALL: System.out.println("秋天"); break; case WINTER: System.out.println("冬天"); break; } } public static void main(String[] args) { for (SeasonEnum s : SeasonEnum.values()) { System.out.println(s); } new EnumTest().judge(SeasonEnum.SPRING); } }
枚举类有两种:抽象枚举类和非抽象枚举类。
抽象枚举类:这个枚举类里要有抽象方法,但是不一定必须有
非抽象枚举类:默认使用final修饰,因此枚举类不能派生子类,但是,不是说抽象类枚举类也不能派生子类。
enum关键字!
枚举类是一个特殊的类,但是它也有类Feild,方法,构造器
枚举类的实例只能是枚举值,枚举类创建实例的时候不是使用new来创建的,枚举值就是实例。
enum Gender { MALE,FEMALE;//这是两个枚举值 public String name;//可见枚举类也有Feild,这是一个实例Feild(实例变量) } public class GenderTest { public static void main(String[] args) { //通过Enum的valueOf方法,来获得指定的枚举类的枚举值 Gender g = Enum.valueOf(Gender.class,"FEMALE"); //取出FEMALE枚举值给g引用变量 //直接为枚举值的Feild赋值 g.name = "女"; System.out.println(g + "代表:" + g.name); //输出结果是”FEMALE 代表:女“ } }//缺点:FEMALE枚举值可能会被输出成“男”,需要想办法把枚举值给固定了,就是让MALE只能输出男,FEMALE只能输出女
上面的缺点很明显,我们可以改进,让枚举类使用setter方法和getter方法
enum Gender { MALE,FEMALE; private String name; public void setName(String name) { switch(this)//this可能是MALE和FEMALE这两个枚举值 { case MALE: if(name.equals("男")) { this.name = name; } else { System.out.println("参数错误"); } case FEMALE: if(name.equals("女")) { this.name = name; } else { System.out.println("参数错误"); } } } public String getName() { return this.name; } } public class GenderTest2 { public static void main(String[] args) { Gender g = Enum.valueOf(Gender.class,"FEMALE"); g.setName("女"); System.out.println(g + "代表" + g.getName()); g.setName("男"); System.out.println(g + "代表" + g.getName()); } } 44,1 Bot
上面的设计其实还是不够好,虽然当我们使用FEMALE等于男是,会显示参数错误,但是我们一般将枚举类设计成不可变类,它的Field值不应该被改变,这样更安全和简洁,为此,我们的枚举类中的Field一般都是用pivate final来修饰
因为我们将所有的Field都用final修饰了,所以,我们必须在构造器中为这些Field指定初始值。
下面是一个在构造器中为枚举类指定初始值
enum Gender { MALE("男"),FEMALE("女"); //枚举值,枚举值是枚举类的实例,现在就是在给实例赋了一个初始值 //你也许看不懂,没有看出来,这哪里创建实例了?,其实枚举类创建实例就是这样,不使用new //这两个枚举值其实已经调用了下面的构造器了 private final String name;//Field private Gender(String name)//构造器 { this.name = name; } public String getName() { return this.name; } } public class GenderTest3 { public static void main(String[] args) { //创建了一个Gender类型的引用变量b //使用Enum.valueOf方法,来调用FEMALE这个实例,或者说是对象,或者说是枚举值 //Gender.class 干嘛用到还不知道 Gender b = Enum.valueOf(Gender.class,"FEMALE"); System.out.println(b.getName()); } }
上面运行:
[[email protected] java]# java GenderTest3
女
发现:我们创建了实例FEMALE就只能输出女
时间: 2024-10-06 01:34:11