1. 枚举类概述
在某些情况下,一个类的对象是有限而且固定的。例如季节类,只有四个对象手动实现枚举类
private修饰构造器属性使用private final修饰把该类的所有实例都使用 public static final 来修饰
2. 示例代码
package com.atguigu.javase.lesson9;
public class Season {
private final String SEASON_NAME;
private final String SEASON_DESC;
private Season(String seasonName, String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
public final static Season SPRING =
new Season(
"春天",
"春风又绿江南岸");
public final static Season SUMMER =
new Season(
"夏天",
"映日荷花别样红");
public final static Season AUTUMN =
new Season(
"秋天",
"秋水共长天一色");
public final static Season WINTER =
new Season(
"冬天",
"窗含西岭千秋雪");
}
2. 使用enum定义枚举类
JDK1.5新增的enum关键字用于定义枚举类枚举类和普通类的区别:
使用enum定义的枚举类默认继承了java.lang.Enum类枚举类的构造器只能使用private访问控制符枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾)。列出的实例系统会自动添加public static final修饰。所有的枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值。JKD1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定。若枚举只是一个成员,则可以作为一种单例模式的实现方式。
3. 枚举类属性
枚举类对象的属性不应允许被改动,所以应该使用private final修饰枚举类使用private final修饰的属性应该在构造器中为其赋值若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
4. 示例代码season
package com.atguigu.javase.lesson9;
public class Season {
private final String SEASON_NAME;
private final String SEASON_DESC;
private Season(String seasonName, String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
public final static Season SPRING =
new Season(
"春天",
"春风又绿江南岸");
public final static Season SUMMER =
new Season(
"夏天",
"映日荷花别样红");
public final static Season AUTUMN =
new Season(
"秋天",
"秋水共长天一色");
public final static Season WINTER =
new Season(
"冬天",
"窗含西岭千秋雪");
}
5. 示例代码Season2
package com.atguigu.javase.lesson9;
public enum Season2 {
SPRING(
"春天",
"春风又绿江南岸"),
SUMMER(
"夏天",
"映日荷花别样红"),
AUTUMN(
"秋天",
"秋水共长天一色"),
WINTER(
"冬天",
"窗含西岭千秋雪");
String SEASON_NAME;
String SEASON_DESC;
Season2(String seasonName,String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
}
6. 示例代码Info接口
package com.atguigu.javase.lesson9;
public interface Info {
String getInfo();
}
7. 示例代码Season3
package com.atguigu.javase.lesson9;
public enum Season3 implements Info{
SPRING(
"春天",
"春风又绿江南岸"),
SUMMER(
"夏天",
"映日荷花别样红"),
AUTUMN(
"秋天",
"秋水共长天一色"),
WINTER(
"冬天",
"窗含西岭千秋雪");
String SEASON_NAME;
String SEASON_DESC;
Season3(String seasonName, String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
@Override
public String
getInfo() {
switch(
this){
case SPRING:
return "A";
case SUMMER:
return "B";
case AUTUMN:
return "C";
case WINTER:
return "D";
}
return null;
}
}
8. 示例代码Season4
package com.atguigu.javase.lesson9;
public enum Season4 implements Info{
SPRING(
"春天",
"春风又绿江南岸") {
@Override
public String
getInfo() {
return "^^A";
}
},
SUMMER(
"夏天",
"映日荷花别样红") {
@Override
public String
getInfo() {
return "^^B";
}
},
AUTUMN(
"秋天",
"秋水共长天一色") {
@Override
public String
getInfo() {
return "^^C";
}
},
WINTER(
"冬天",
"窗含西岭千秋雪") {
@Override
public String
getInfo() {
return "^^D";
}
};
String SEASON_NAME;
String SEASON_DESC;
Season4(String seasonName, String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
}
9. 示例代码EnumTestTest
package test.com.atguigu.javase.lesson9;
import com.atguigu.javase.lesson9.Season2;
import com.atguigu.javase.lesson9.Season3;
import com.atguigu.javase.lesson9.Season4;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
/**
* EnumTest Tester.
* 关于枚举:
* 1.定义:一个类的对象是个数有限而且属性固定的。
*
* 2.手动定义枚举类:
* 2.1.私有化构造器
* 2.2.属性使用final来修饰
* 2.3.在类的内部创建枚举类的对象,且使用public static final修饰
* 2.4.提供一些工具方法:values(), valueOf()....
*
* 3.使用enum关键字定义枚举类
* 3.1.使用enum替代class声明一个类
* 3.2.枚举类对象的声明必须放在枚举类的第一行,声明对象的同时即是创建枚举类对象的过程。
* 3.3.若有属性,需使用private final修饰,使其变为常量
* 3.4.构造器默认使用private修饰。
*
* 4.枚举类的常用的方法
* 4.1.values()得到所有枚举类对象的集合。
* 4.2.valueOf(Class<T> enumType, String name):根据传入的字符串得到对应enumType类型的枚举类的对象
* 5.实现接口的枚举类
* 5.1.统一在一个方法中提供各个枚举类对象的实现,可以使用switch
* 5.2.在声明对象的同时,提供方法的实现
*
*/
public class EnumTestTest {
@Test
public void testEnumMethod(){
Season2[] seasons = Season2.values();
for(Season2 season : seasons){
System.out.println(season);
}
String input =
"SPRING";
Season2 s = Enum.valueOf(Season2.class,input);
System.out.println(s);
}
@Test
public void testEnumAndInterface3(){
System.out.println(Season3.AUTUMN.getInfo());
}
@Test
public void testEnumAndInterface4(){
System.out.println(Season4.AUTUMN.getInfo());
}
}