Java枚举使用详解

魅力见仁见智,拼不过姿势拼知识!

愉快的周一,哈哈!周六在家安装了VmPlayer 和Ubuntu,下载了最新的FFmpeg-3.3.2编译一把,然后用android Studio小小的运行了一下,嗯!还不错,终于弥补了之前做音视频编译时作为“伸手党”耻辱。当然,也只是编译出了arm架构的so包,也只是简单模仿网上大神,也只是简单的实现了小功能,等有些问题搞明白了,再写关于编译和使用FFmpeg的博客(感觉已经入坑了,不过有了久违的成就感!哈哈…)。

这里写图片描述

好了,进入正题。话说,我们为啥药使用枚举呢?

在JDK1.5之前,我们定义常量都是:

public static final ...

想想,如果一个逻辑功能稍微复杂点的类中,再如果常量比较多的,并且大多时候,我们用一组常量来判断某种状态功能的不同情况的,当这种情况状态比较多的时候,大量的静态常量会导致程序的代码量臃肿,并且可读性差,所以有了枚举,就可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。相应的,在JDK1.6,switch语句也添加了对枚举的响应判断,于是这个体系也得到了相应的完善。

枚举使用的情形:在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”…

接下来,我们在代码中实际的操作一下枚举的使用:

1.普通形式

    /**
     * 
     * @author TCX
     *
     */
    public enum WeekdaysEnum1{
        Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;

    }

这是最基础的枚举写法,使用的时候,直接调用即可:

//获取枚举对象
WeekdaysEnum1 day1=WeekdaysEnum1.Saturday;
//当前枚举名称
String str1="当前是枚举类型一:"+day1.name();
//当前枚举的索引
str1="     索引为:"+day1.ordinal();
//枚举长度
str1="     长度为:"+WeekdaysEnum1.values().length;
//遍历枚举
for(WeekdaysEnum1 days:WeekdaysEnum1.values()){
        str1=str1+days.name()+"       ";
}
content.setText(str1);

2.添加属性和方法的枚举写法

    /**
     * 枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
     * @author TCX
     *
     */
    public enum WeekdaysEnum2{
        Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;

        private final static String position = "1";

        public static WeekdaysEnum2 getDay() {
            if ("1".equals("1"))
                return Monday;
            else
                return Tuesday;
        }
    }

这种类型的枚举,可以在枚举的getDay()方法中添加默认的参数值。使用方法如下:

WeekdaysEnum2 day2=WeekdaysEnum2.Saturday;      
//当前枚举名称
String str2="当前是枚举类型二:"+WeekdaysEnum2.getDay();
//当前枚举的索引
str2="     索引为:"+day2.ordinal();
//枚举长度
str2="     长度为:"+WeekdaysEnum2.values().length;         
for(WeekdaysEnum2 days:WeekdaysEnum2.values()){     
        str2=str2+days.name()+"       ";
}
content.setText(str2);

3.实现带有构造器的枚举

注意的是:通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错;赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错。

 /**
    * 实现带有构造器的枚举
    * @author TCX
    *
    */
    public enum WeekdaysEnum3{         Monday("1"),Tuesday("2"),Wednesday("3"),Thursday("4"),Friday("5"),Saturday("6"),Sunday("7");
        private final String value;
        //构造器默认也只能是private, 从而保证构造函数只能在内部使用
        WeekdaysEnum3(String value) {
            this.value = value;
        }
        public String getValue() {
            return value;
        }
    }

当给此枚举赋值的时候,那么这个value就是之前的值如:

public WeekdaysEnum3 getCurrentDay(){

    return WeekdaysEnum3.Monday;
}

....

//接着调用

getCurrentDay().getValue();//猜猜打印的结果是啥。哈哈

4.带有抽象方法的枚举

        /**
         * 带有抽象方法的枚举
         * @author TCX
         *
         */
        public enum WeekdaysEnum4 {
            Monday {
                public String getName(){
                    return "周一";
                    }
                },
            Tuesday {
                public String getName(){
                        return "周二";
                        }
                    },

            Wednesday {
                public String getName(){
                    return "周三";
                    }
                },

            Thursday {
                public String getName(){
                        return "周四";
                    }
                },

            Friday {
                public String getName(){
                    return "周五";
                    }
                },


            Saturday {
                public String getName(){
                        return "周六";
                        }
                    },

            Sunday {
                public String getName(){
                    return "周日";
                    }
                };



            public abstract String getName();
        }

使用的方式:

WeekdaysEnum4 day4=WeekdaysEnum4.Wednesday; 
//当前枚举名称
String str4="当前是枚举类型四:"+day4.getName();
//当前枚举的索引
str4="     索引为:"+day4.ordinal();
//枚举长度
str4="     长度为:"+WeekdaysEnum4.values().length;
for(WeekdaysEnum4 days:WeekdaysEnum4.values()){         
    str4=str4+days.getName()+"       ";     
    }
content.setText(str4);

测试的完整类:

package com.tian.threadtestdemo.utils;


/**
 * 枚举测试基类
 * 
 * @author TCX
 *
 */
public class EnumTest {


    /**
     * 
     * @author TCX
     *
     */
    public enum WeekdaysEnum1{
        Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;

    }



    /**
     * 枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
     * @author TCX
     *
     */
    public enum WeekdaysEnum2{
        Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;

        private final static String position = "1";

        public static WeekdaysEnum2 getDay() {
            if ("1".equals("1"))
                return Monday;
            else
                return Tuesday;
        }
    }

   /**
    * 实现带有构造器的枚举
    * @author TCX
    *
    */
    public enum WeekdaysEnum3{
        Monday("1"),Tuesday("2"),Wednesday("3"),Thursday("4"),Friday("5"),Saturday("6"),Sunday("7");
        //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错
        //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错
        private final String value;
        //构造器默认也只能是private, 从而保证构造函数只能在内部使用
        WeekdaysEnum3(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }



        /**
         * 带有抽象方法的枚举
         * @author TCX
         *
         */
        public enum WeekdaysEnum4 {
            Monday {
                public String getName(){
                    return "周一";
                    }
                },
            Tuesday {
                public String getName(){
                        return "周二";
                        }
                    },

            Wednesday {
                public String getName(){
                    return "周三";
                    }
                },

            Thursday {
                public String getName(){
                        return "周四";
                    }
                },

            Friday {
                public String getName(){
                    return "周五";
                    }
                },


            Saturday {
                public String getName(){
                        return "周六";
                        }
                    },

            Sunday {
                public String getName(){
                    return "周日";
                    }
                };



            public abstract String getName();
        }





}

OK,枚举的几种使用方式,及测试代码就到这了!如过有什么问题,请留言说明,一起讨论学习!谢谢!

每天进步一点点,时间会让你变成巨人!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值