Java枚举的使用
来源:互联网 发布:js怎么解析json数据 编辑:程序博客网 时间:2024/06/01 09:07
常量与枚举
一、常量定义方法
常量是其值固定不变的量,一般可以分为字面常量和命名常量,如数字1,2,1.3,字符串“abc”,这些就是字面常量,而命名常量是我们使用一些有意义的名称来代表字面常量值,通常命名常量有助于我们更好地理解程序的逻辑。
在Java中,我们通常使用public static final ... 方式来定义常量,如:
public static final int MAX_VALUE = 1000;
在JDK1.5之前,我们如果需要表示一组相关的常量,可以使用如下方法完成:
/** * 星期 * @author 小明 * */public class WeekDay { public static final int MONDAY = 1; // 星期一 public static final int TUESDAY = 2; // 星期二 public static final int WEDNESDAY = 3; // 星期三 public static final int THURSDAY = 4; // 星期四 public static final int FRIDAY = 5; // 星期五 public static final int SATURDAY = 6; // 星期六 public static final int SUNDAY = 0; // 星期日}
现在好了,我们可以把相关的常量封装到一个枚举类型中,而且枚举还提供了比常量更多的方法。
二、枚举定义方法
枚举的简单定义方法如下:
/** * 星期枚举 * @author 小明 * */public enum WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
那我们能不能像使用常量一样给每个枚举类型一个数值呢,答案是肯定的。
默认情况下,每个枚举值对应一个整型数字值。第一个枚举值对应数字0,第二个枚举值对应数字1,以后每个枚举值所对应数字是(前一个枚举数值+1)的结果。当然,我们也可以自己重新给每个枚举值指定一个数值。
如何实现自定义每个枚举值对应的数字值呢?枚举类型提供了构造方法,我们可以通过构造方法与toString()方法来实现。则改造后的代码如下:
/** * 星期枚举 * * @author 小明 * */public enum WeekDay { // 利用构造方法传参 MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(0); private int val; private WeekDay(int val) { this.val = val; } @Override public String toString() { return String.valueOf(this.val); }}
由此看来,枚举中我们也可以定义成员变量与构造方法。
但需要注意的是,枚举类的构造方法与普通类的构造方法有很大的不同:
- 枚举构造方法只在构造枚举值时被调用
- 枚举构造方法只能是private私有的,不能为public公有的
枚举中还可以定义成员方法,改造后的代码如下:
/** * 星期枚举 * * @author 小明 * */public enum WeekDay { // 利用构造方法传参 MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY( "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY( "星期日", 0, 7); private String name; // 中文名称 private int val; // 对应数字值 private int index; // 索引 private WeekDay(String name, int val, int index) { this.name = name; this.val = val; this.index = index; } /** * 获取中文名称 * * @return 中文名称字符串 */ public String getName() { return this.name; } /** * 获取枚举值对应数值 * * @return 枚举对应数值 */ public int getVal() { return this.val; } /** * 获取枚举值索引 * * @return 索引 */ public int getIndex() { return this.index; } /** * 设置中文名称 * * @param name * 中文名称 */ public void setName(String name) { this.name = name; } /** * 设置数字值 * * @param val * 数值 */ public void setVal(int val) { this.val = val; } /** * 设置索引 * * @param index * 索引 */ public void setIndex(int index) { this.index = index; } /** * 根据索引获取枚举值中文名称 * * @param index * 索引 * @return 该索引枚举值中文名称 */ public static String getName(int index) { for (WeekDay weekDay : WeekDay.values()) { if (weekDay.getIndex() == index) return weekDay.getName(); } return null; } @Override public String toString() { return "WeekDay " + super.toString() + "[name=" + this.name + " val=" + this.val + " index=" + this.index + "]"; }}
关于使用枚举类型的说明
所有枚举都继承了Enum的方法,下面详细介绍这些方法:
- ordinal():返回枚举值在枚举中的顺序,这个顺序是按照枚举值定义的顺序从0开始依次递增的
- name():返回枚举值的名称
- compartTo(E):因Enum实现了Comparable接口,因此可以比较此对象与指定对象的顺序
- values():返回一个包含全部枚举值的数组
- toString():返回枚举值的名称
- valueOf(String)/valueOf(Class, String):返回带指定名称的指定枚举类型的枚举值
- equals(Object):比较两个枚举对象的引用
我们可以将枚举看作是类,并且是一个不能被继承的final类,其枚举值是类的静态常量,我们可以通过如下语法来获取枚举的一个实例,如
WeekDay wd = WeekDay.MONDAY;
一个完整的示例
public class WeekDayTest { /** * 定义枚举类型 */ public enum WeekDay { // 利用构造方法传参 MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY( "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY( "星期日", 0, 7); private String name; // 中文名称 private int val; // 对应数字值 private int index; // 索引 private WeekDay(String name, int val, int index) { this.name = name; this.val = val; this.index = index; } /** * 获取中文名称 * * @return 中文名称字符串 */ public String getName() { return this.name; } /** * 获取枚举值对应数值 * * @return 枚举对应数值 */ public int getVal() { return this.val; } /** * 获取枚举值索引 * * @return 索引 */ public int getIndex() { return this.index; } /** * 设置中文名称 * * @param name * 中文名称 */ public void setName(String name) { this.name = name; } /** * 设置数字值 * * @param val * 数值 */ public void setVal(int val) { this.val = val; } /** * 设置索引 * * @param index * 索引 */ public void setIndex(int index) { this.index = index; } /** * 根据索引获取枚举值中文名称 * * @param index * 索引 * @return 该索引枚举值中文名称 */ public static String getName(int index) { for (WeekDay weekDay : WeekDay.values()) { if (weekDay.getIndex() == index) return weekDay.getName(); } return null; } @Override public String toString() { return "WeekDay - " + super.toString() + "[name=" + this.name + ", val=" + this.val + ", index=" + this.index + "]"; } } public static void main(String[] args) { // 遍历所有枚举值 for (WeekDay weekDay : WeekDay.values()) { System.out.println(weekDay); } System.out.println("************************************"); // 将字符串“FRIDAY”转换为枚举类型 WeekDay wd = WeekDay.valueOf("FRIDAY"); // 输出转换后星期的中文名称,数字值及自定义索引值,枚举值顺序值,枚举值名称 System.out.println("中文名称:" + wd.getName()); System.out.println("数字值:" + wd.getVal()); System.out.println("自定义索引值:" + wd.getIndex()); System.out.println("顺序值:" + wd.ordinal()); System.out.println("枚举值名称:" + wd.name()); System.out.println("************************************"); // 比较两个枚举实例是否一致 System.out.println("两个枚举实例是否一致:" + wd.equals(WeekDay.FRIDAY)); // 比较两个枚举值大小 System.out.println("两个枚举值大小:" + WeekDay.MONDAY.compareTo(WeekDay.FRIDAY)); }}
运行结果:
WeekDay - MONDAY[name=星期一, val=1, index=1]WeekDay - TUESDAY[name=星期二, val=2, index=2]WeekDay - WEDNESDAY[name=星期三, val=3, index=3]WeekDay - THURSDAY[name=星期四, val=4, index=4]WeekDay - FRIDAY[name=星期五, val=5, index=5]WeekDay - SATURDAY[name=星期六, val=6, index=6]WeekDay - SUNDAY[name=星期日, val=0, index=7]************************************中文名称:星期五数字值:5自定义索引值:5顺序值:4枚举值名称:FRIDAY************************************两个枚举实例是否一致:true两个枚举值大小:-4
0 0
- Java 的枚举使用
- java枚举的使用
- java枚举的使用
- Java枚举的使用
- java枚举的使用
- Java枚举的使用
- java枚举的使用
- java 的枚举使用
- Java枚举的使用
- java枚举的使用
- java 枚举的使用
- 枚举的使用 java
- Java的枚举使用
- java-枚举的使用
- Java枚举类型的使用
- Java枚举类型的使用
- Java枚举类型的使用
- java enum枚举的使用
- genymotion 模拟器
- keepalived+twemproxy部署redis高可用集群
- Android WebView使用方法
- myeclipse的破解方法
- ZOJ 3333 Guess the price
- Java枚举的使用
- 经验解决Fragment 被 Replace后仍旧可见的问题
- Java 标记接接口
- oracel常见问题
- poj 1417
- poj1014 多重背包
- As of ADT 14, resource fields cannot be used as switch
- 最小生成树-普利姆算法eager实现
- cocos2dx3.4 Menu