您的位置:首页 > 编程语言 > Java开发

Java枚举使用详解

2017-07-03 18:48 260 查看
魅力见仁见智,拼不过姿势拼知识!

愉快的周一,哈哈!周六在家安装了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);


[b]测试的完整类:


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

每天进步一点点,时间会让你变成巨人!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 枚举 Enum android