1.如何自定义枚举类
-
类的对象只有有限个,确定的
-
当需要定义一组常量时,强烈建议使用枚举
-
如果枚举类中只有一个对象,则可以作为单例模式的实现方式
例如:
星期:星期一、星期二、星期三、星期四、星期五、星期六、星期天
性别:男、女
自定义枚举类
方式一: jdk5.0之前,自定义枚举类
package com.carl.javaadvanced.enumtest;
//jdk5.0之前定义枚举类的方式
public class EnumTest {
//1.private final修饰属性
private final String WEEKDAY;
private final String PLAN;
//2.私有化构造器
private EnumTest(String WEEKDAY,String PLAN){
this.WEEKDAY=WEEKDAY;
this.PLAN=PLAN;
}
//3.类内部创建对象Monday Tuesday Wednesday Thursday Friday Saturday Sunday
public static final EnumTest MONDAY=new EnumTest("星期一","Java常用类--String");
public static final EnumTest TUESDAY=new EnumTest("星期二","Java常用类--StringBuffer");
public static final EnumTest WEDNESDAY=new EnumTest("星期三","Java常用类--StringBuilder");
public static final EnumTest THURSDAY=new EnumTest("星期四","Java常用类--Date");
public static final EnumTest FRIDAY=new EnumTest("星期五","Java常用类--System");
public static final EnumTest SATURDAY=new EnumTest("星期六","Java常用类--枚举");
public static final EnumTest SUNDAY=new EnumTest("星期天","Java常用类--注解");
//4.其他需求:获取属性值
public String getWEEKDAY(){
return this.WEEKDAY;
}
public String getPLAN() {
return this.PLAN;
}
@Override
public String toString(){
return WEEKDAY+":"+PLAN;
}
}
class Test{
public static void main(String[] args) {
EnumTest friday = EnumTest.FRIDAY;
System.out.println(friday);
}
}
方式二:JDK5.0以后,可以使用enum关键字定义枚举类
//jdk5.0以后使用enum关键字定义枚举类--对比5.0以前
enum EnumTest2{
//1.创建枚举值,枚举值之间用","隔开,最后用";"结束
MONDAY("星期一","Java常用类--String"),
TUESDAY("星期二","Java常用类--StringBuffer"),
WEDNESDAY("星期三","Java常用类--StringBuilder"),
THURSDAY("星期四","Java常用类--Date"),
FRIDAY("星期五","Java常用类--System"),
SATURDAY("星期六","Java常用类--枚举"),
SUNDAY("星期天","Java常用类--注解");
//2.private final修饰属性
private final String WEEKDAY;
private final String PLAN;
//3.私有化构造器--可以省略private
EnumTest2(String WEEKDAY,String PLAN){
this.WEEKDAY=WEEKDAY;
this.PLAN=PLAN;
}
//4.其他需求:获取属性值
public String getWEEKDAY(){
return this.WEEKDAY;
}
public String getPLAN() {
return this.PLAN;
}
//Enum抽象类中重写的toString方法返回的是枚举值的name
@Override
public String toString(){
return WEEKDAY+":"+PLAN;
}
}
总结:
jdk5.0以前 1.成员属性必须声明为private final 2.构造器必须声明为私有构造器private 3.由于私有化构造器,必须在类内部创建枚举对象,必须修饰为public static final 4.扩展方法根据需求可以写,调用方式:类名.枚举name.方法名() jdk5.0以后 1.枚举值必须声明在第一行;默认为private static final(不能再写) 2.成员属性必须声明为private final 3.构造器私有化,可不写private 4.扩展方法根据需求可以写,调用方式:类名.枚举name.方法名() 5.toString()方法被Enum抽象类重写了,返回值是枚举值的name–根据需要可以重写
enum关键字创建枚举类,获取枚举值的遍历方式:
方式1:遍历:类名.class.getEnumConstants()
方式2:遍历:类名.values()
class Test{
public static void main(String[] args) {
//jdk5.0以前自定义枚举类的调用方式
EnumTest friday = EnumTest.FRIDAY;
String plan = friday.getPLAN();
String weekday = friday.getWEEKDAY();
System.out.println(friday);
System.out.println("*********************");
//jdk5.0以后使用enum关键字自定义枚举类的调用方式
EnumTest2 friday2 = EnumTest2.FRIDAY;
String plan2 = friday2.getPLAN();
String weekday2 = friday2.getWEEKDAY();
System.out.println(friday);
//enum自定义枚举类的两种遍历方式
for (EnumTest2 enumConstant : EnumTest2.class.getEnumConstants()) {
System.out.println(enumConstant);
}
for (EnumTest2 value : EnumTest2.values()) {
System.out.println(value);
}
}
}
2.Enum类的主要方法
1.valueOf()
2.toString()
3.values()
3.实现接口的枚举类
枚举类实现接口有两种方式:
方式一:implements 接口,重写该方法—与接口实现类一样
enum EnumTest2 implements info{
//1.创建枚举值,枚举值之间用","隔开,最后用";"结束
MONDAY("星期一","Java常用类--String"),
TUESDAY("星期二","Java常用类--StringBuffer"),
WEDNESDAY("星期三","Java常用类--StringBuilder"),
THURSDAY("星期四","Java常用类--Date"),
FRIDAY("星期五","Java常用类--System"),
SATURDAY("星期六","Java常用类--枚举"),
SUNDAY("星期天","Java常用类--注解");
//2.private final修饰属性
private final String WEEKDAY;
private final String PLAN;
//3.私有化构造器--可以省略private
EnumTest2(String WEEKDAY,String PLAN){
this.WEEKDAY=WEEKDAY;
this.PLAN=PLAN;
}
//4.其他需求:获取属性值
public String getWEEKDAY(){
return this.WEEKDAY;
}
public String getPLAN() {
return this.PLAN;
}
//Enum抽象类中重写的toString方法返回的是枚举值的name
@Override
public String toString(){
return WEEKDAY+":"+PLAN;
}
@Override
public void show() {
}
}
方式二:implements 接口,可以在枚举值的末尾加上{}重写接口中的方法,每个枚举值都有自己的重写方法
可以通过EnumTest2.MONDAY.show()执行MONDAY中重写show的内容
enum EnumTest2 implements info{
//1.创建枚举值,枚举值之间用","隔开,最后用";"结束
MONDAY("星期一","Java常用类--String"){
@Override
public void show() {
System.out.println("String类具有不可变性,修改的值会在字符串常量池中重新创建一块区域存放");
}
},
TUESDAY("星期二","Java常用类--StringBuffer"){
@Override
public void show() {
System.out.println("StringBuffer是线程安全的,可变字符序列");
}
},
WEDNESDAY("星期三","Java常用类--StringBuilder"){
@Override
public void show() {
System.out.println("StringBuilder是非线程安全的,可变字符序列");
}
},
THURSDAY("星期四","Java常用类--Date"){
@Override
public void show() {
System.out.println("Date类方法是重点,需要对时间格式进行频繁的处理");
}
},
FRIDAY("星期五","Java常用类--System"){
@Override
public void show() {
System.out.println("这个我没看,完蛋");
}
},
SATURDAY("星期六","Java常用类--枚举"){
@Override
public void show() {
System.out.println("枚举在JDK5.0以前不支持enum关键字,需要自定义,在JDK5.0以后可以使用enum创建枚举类,枚举类可以实现接口并重写");
}
},
SUNDAY("星期天","Java常用类--注解"){
@Override
public void show() {
System.out.println("还没到星期天呢");
}
};
//2.private final修饰属性
private final String WEEKDAY;
private final String PLAN;
//3.私有化构造器--可以省略private
EnumTest2(String WEEKDAY,String PLAN){
this.WEEKDAY=WEEKDAY;
this.PLAN=PLAN;
}
//4.其他需求:获取属性值
public String getWEEKDAY(){
return this.WEEKDAY;
}
public String getPLAN() {
return this.PLAN;
}
//Enum抽象类中重写的toString方法返回的是枚举值的name
@Override
public String toString(){
return WEEKDAY+":"+PLAN;
}
}