Java枚举

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;
    }

}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值