Java enum(枚举)小结
来源:互联网 发布:淘宝女装店铺推荐 编辑:程序博客网 时间:2024/05/29 14:15
一、定义(语法)
enum全称为enumeration,中文意为枚举,枚举简单的说就是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。
创建枚举类型是需要用到enum关键字,如:
<span style="font-size:18px;">public enum Color{RED, GREEN, BLUE, BLACK, PINK, WHITE;}</span>enum的语法看似与class不同,但它实际上就是一个类,经过编译器编译之后得到一个.class文件。
创建的枚举类型默认是java.lang.enum<枚举类型名>(抽象类)的子类。
每个枚举项的类型都为public static final 。
因为Java的单继承机制,emum不能再用extends继承其他的类。
我们可以使用javap命令进行反编译验证。
既然enum是一个类,那么它就可以像一般的类一样拥有自己的属性与方法。但Java要求必须先定义enum实例。
否则会编译错误。
<span style="font-size:14px;">public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }</span>枚举实例的创建过程:枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
<span style="font-size:18px;">public enum Color{RED, GREEN, BLUE, BLACK, PINK, WHITE;}</span>
相当于调用了六次Enum<Color>构造方法
Enum<Color>("RED", 0);
Enum<Color>("GREEN", 1);
Enum<Color>("BLUE", 2);
Enum<Color>("BLACK", 3);
Enum<Color>("PINK",4);
Enum<Color>("WHITE", 5);
枚举类型的常用方法:
int compareTo(E o) 比较此枚举与指定对象的顺序。
Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零
String toString() 返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
与http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html)
用法一:常量
在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
<span style="font-size:14px;">enum Color{RED, GREEN, BLUE, BLACK, PINK, WHITE;}public class TestEnum {public void changeColor(){Color color = Color.RED;System.out.println("原色:" + color);switch(color){case RED:color = Color.GREEN;System.out.println("变色:" + color);break;case GREEN:color = Color.BLUE;System.out.println("变色:" + color);break;case BLUE:color = Color.BLACK;System.out.println("变色:" + color);break;case BLACK:color = Color.PINK;System.out.println("变色:" + color);break;case PINK:color = Color.WHITE;System.out.println("变色:" + color);break;case WHITE:color = Color.RED;System.out.println("变色:" + color);break;}}public static void main(String[] args){TestEnum testEnum = new TestEnum();testEnum.changeColor();}}</span>
用法三:实现接口
<span style="font-size:14px;">public interface Behaviour { void print(); String getInfo(); } public enum Color implements Behaviour { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } // 接口方法 @Override public String getInfo() { return this.name; } // 接口方法 @Override public void print() { System.out.println(this.index + ":" + this.name); } }</span>
用法四:枚举集合的应用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档
<span style="font-size:14px;">public class Test { public static void main(String[] args) { // EnumSet的使用 EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); for (EnumTest day : weekSet) { System.out.println(day); } // EnumMap的使用 EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class); weekMap.put(EnumTest.MON, "星期一"); weekMap.put(EnumTest.TUE, "星期二"); // ... ... for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) { Entry<EnumTest, String> entry = iter.next(); System.out.println(entry.getKey().name() + ":" + entry.getValue()); } }}</span>
三、综合实例
<span style="font-size:14px;">package com.ljq.test;/** * 枚举用法详解 * * @author jiqinlin * */public class TestEnum { /** * 普通枚举 * * @author jiqinlin * */ public enum ColorEnum { red, green, yellow, blue; } /** * 枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法 * * @author jiqinlin * */ public enum SeasonEnum { //注:枚举写在最前面,否则编译出错 spring, summer, autumn, winter; private final static String position = "test"; public static SeasonEnum getSeason() { if ("test".equals(position)) return spring; else return winter; } } /** * 性别 * * 实现带有构造器的枚举 * * @author jiqinlin * */ public enum Gender{ //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错 //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错 MAN("MAN"), WOMEN("WOMEN"); private final String value; //构造器默认也只能是private, 从而保证构造函数只能在内部使用 Gender(String value) { this.value = value; } public String getValue() { return value; } } /** * 订单状态 * * 实现带有抽象方法的枚举 * * @author jiqinlin * */ public enum OrderState { /** 已取消 */ CANCEL {public String getName(){return "已取消";}}, /** 待审核 */ WAITCONFIRM {public String getName(){return "待审核";}}, /** 等待付款 */ WAITPAYMENT {public String getName(){return "等待付款";}}, /** 正在配货 */ ADMEASUREPRODUCT {public String getName(){return "正在配货";}}, /** 等待发货 */ WAITDELIVER {public String getName(){return "等待发货";}}, /** 已发货 */ DELIVERED {public String getName(){return "已发货";}}, /** 已收货 */ RECEIVED {public String getName(){return "已收货";}}; public abstract String getName(); } public static void main(String[] args) { //枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值 ColorEnum colorEnum = ColorEnum.blue; switch (colorEnum) { case red: System.out.println("color is red"); break; case green: System.out.println("color is green"); break; case yellow: System.out.println("color is yellow"); break; case blue: System.out.println("color is blue"); break; } //遍历枚举 System.out.println("遍历ColorEnum枚举中的值"); for(ColorEnum color : ColorEnum.values()){ System.out.println(color); } //获取枚举的个数 System.out.println("ColorEnum枚举中的值有"+ColorEnum.values().length+"个"); //获取枚举的索引位置,默认从0开始 System.out.println(ColorEnum.red.ordinal());//0 System.out.println(ColorEnum.green.ordinal());//1 System.out.println(ColorEnum.yellow.ordinal());//2 System.out.println(ColorEnum.blue.ordinal());//3 //枚举默认实现了java.lang.Comparable接口 System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1 //-------------------------- System.out.println("==========="); System.err.println("季节为" + SeasonEnum.getSeason()); //-------------- System.out.println("==========="); for(Gender gender : Gender.values()){ System.out.println(gender.value); } //-------------- System.out.println("==========="); for(OrderState order : OrderState.values()){ System.out.println(order.getName()); } } }</span>
- Java enum(枚举)小结
- Java枚举(Enum)
- java.lang.Enum类:枚举类型 小结
- java基础---枚举(enum)
- java enum(枚举)理解
- java enum(枚举)理解
- Java enum(枚举) 详解
- Java中的enum(枚举)
- [Java 14 枚举] Enum, enum
- Java 枚举类型(java.lang.Enum)
- java笔记(十):枚举(enum)
- java例程练习(枚举Enum类)
- Java enum(枚举)的简单使用
- java的枚举类型(enum)实例
- java学习笔记之 --------枚举(enum)
- Java Enum(枚举一)的用法
- java enum类(枚举类)
- java进阶(一):枚举-enum
- Fragment使用详解
- 阿里云ECS使用
- Android之SurfaceView学习(一)
- 字符编码全总结
- css 设置浏览器最小宽度
- Java enum(枚举)小结
- javascript、jquery、AJAX总结
- LeetCode 118 Pascal's Triangle(帕斯卡三角形)(vector)
- android高级控件之Volley
- 安装CocoaPods提速的方法
- Android布局
- 泛型边界和通配符
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)|分块|莫队算法
- Intent Filter用法