JAVA ENUM
来源:互联网 发布:ug编程和pm编程那个累 编辑:程序博客网 时间:2024/05/19 21:16
在C语言中存在一个枚举类型,通过此类型可以限制一个内容的取值范围,但是在JDK1.5之前,java中并不存在枚举的类型,所以很多之前已经习惯使用枚举操作的开发人员就感觉很不适应,为了解决这样的问题,所以在JDK1.5之后加入了枚举的类型
在JDK1.5之前为了实现与枚举类似的功能,往往都使用以下的操作形式,例如:颜色Color的操作范围:红色、绿色、蓝色
package org.enumdemo;public class colordemo {private String name;public static final colordemo RED = new colordemo("红色");public static final colordemo BLUE = new colordemo("蓝色");public static final colordemo GREEN = new colordemo("绿色");private colordemo(String name){this.setName(name);}public void setName(String name){this.name = name;}public String getName(){return this.name;}public static Color getInstance(colordemo color){if (color == RED){return RED;}else if(color == BLUE){return BLUE;}else{return GREEN;}}}
以上的代码,就是将构造方法进行私有化的一种操作,所以以后要么通过static 属性得到Color 的实例化对象
package org.enumdemo;public class EnumDemo01 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(colordemo.RED.getName());System.out.println( colordemo.getInstance(colordemo.BLUE));System.out.println(ColorDemo01.RED);}}
实现枚举还要以使用接口
package org.enumdemo;interface ColorDemo01{public static final int RED =1;public static final int BLUE =2;public static final int GREEN =3;}
但是,通过以上的方式实现的枚举是会存在问题,会存在操作结果不正确的问题
package org.enumdemo;public class EnumDemo01 {/** * @param args */public static void main(String[] args) {System.out.println(ColorDemo01.RED+ColorDemo01.BLUE);}}
以上的操作有可能发生歧义,而且也不能明确的知道一个枚举的取值范围
Enum 关键字
在JDK1.5之后,可以直接使用enum关键字定义一个枚举的类型
package org.enumdemo;public enum ColorEnum{ RED,BLUE,GREEN;}
此时已经完了一个枚举类型的定义,那么在使用的时候直接通过
package org.enumdemo;public class EnumDemo02 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ColorEnum c = ColorEnum.RED; System.out.print(c); }}
而且,使用此方式还可以避免之前使用接口实现枚举的操作
package org.enumdemo;public class EnumDemo02 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.print(ColorEnum.RED + ColorEnum.BLUE);}}
而且枚举在JDK1.5之后也可以直接在switch语句之中使用,switch判断是时候只能判断字符或数字但是JDK1.5之后可以判断枚举类型
package org.enumdemo;public class EnumDemo03 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubswitch (ColorEnum.RED){case RED:{System.out.println("红色");break;}case BLUE:{System.out.println("蓝色");break;}case GREEN:{System.out.println("绿色");break;}}}}
Enum类和enum关键字的区别
使用enum关键字可以定义一个枚举类型,那么实际上就相当于定义了一个类,此类继承了Enum类而已。
在Enum类的构造方法中是受保护的,实际上对于每个枚举对象一旦声音之后,就表示自己调用此构造方法,所有的编号采用自动编号的方式进行
package org.enumdemo;public class EnumDemo04 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor(ColorEnum col:ColorEnum.values()){System.out.println(col.name()+"-->"+col.ordinal());}}}
还可以通过此类找到枚举 中的一个指定的内容使用valueof()方法
public static <T extends Enum<T>> T valueOf(Closs<T> enumType,String name)
传入的时候直接传入:Color.class 即可
package org.enumdemo;public class EnumDemo05 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubColorEnum col = ColorEnum.valueOf(ColorEnum.class,"RED");System.out.println(col);}}
通过以上的代码可以发现,直接通过枚举取得指定内容更加简单
类集对枚举的支持
在JDK 1.5之后,增加了两个类集的操作类: EnumSet、EnumMap
EnumMap
EnumMap是Map接口的子类。操作的形式与Map是一致的
package org.enumdemo;import java.util.EnumMap;import java.util.Map;public class EnumDemo03 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubEnumMap<Color,String> emap = new EnumMap<Color,String>(Color.class);emap.put(Color.red, "红色");emap.put(Color.green, "绿色");emap.put(Color.blue, "蓝色");for (Map.Entry<Color,String> me:emap.entrySet()){System.out.println(me.getKey()+"-->"+me.getValue());}}}
EnumSet
EnumSet 本身是Set接口的子类,但是在此类中并没有任何的构造方法定义,表示构造方法被私有化了。此类的方法都是静态的操作。
package org.enumdemo;import java.util.EnumSet;import java.util.Iterator;public class EnumDemo04 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubEnumSet<Color> mset = EnumSet.allOf(Color.class); //表示将全部的内容设置到集合Iterator<Color> ite = mset.iterator();while(ite.hasNext()){System.out.println(ite.next());}}}
以上是将全部的内容设置到集合之中,当然,也可以设置一个指定类型的空集合
package org.enumdemo;import java.util.EnumSet;import java.util.Iterator;public class EnumDemo05 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubEnumSet<Color> mset = EnumSet.noneOf(Color.class); //表示此类型的空集合Iterator<Color> ite = mset.iterator();while(ite.hasNext()){System.out.println(ite.next());}}}
定义构造方法
枚举的使用非常的灵活,可以在枚举中直接定义构造方法,但是一旦构造方法定义之后,则所有枚举对象都必须明确的调用此构造方法。
package org.enumdemo;public enum Color1 {red("红色"),green("绿色"),blue("蓝色");private String name;public String getName(){return this.name;}public void setName(String name){this.name = name;}Color1(String name){this.setName(name);}}
枚举中的构造是不能声明为public 的,因为外部是不能调用枚举的构造方法
那么此时,每一个枚举对象都有其自己的name 属性
package org.enumdemo;public class EnumDemo06 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor (Color1 col:Color1.values()){System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getName() );}}}
让枚举实现一个接口
一个枚举实现一个接口之后,各个枚举对象都必须分别实现接口中的抽象方法
package org.enumdemo;interface Color2{public String getColor();}
package org.enumdemo;public enum Color4 implements Color2{ //实现接口red{public String getColor(){return "红色";}},green{public String getColor(){return "绿色";}},blue{public String getColor(){return "蓝色";}};}
package org.enumdemo;public class EnumDemo07 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor (Color4 col:Color4.values()){System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getColor() );}}}
在枚举中定义抽象方法
在一个枚举中也可以定义多个抽象方法,那么这样一来,枚举中的每个对象都必须单独实现此方法
package org.enumdemo;public enum Color3 {red{public String getColor(){return "红色";}},green{public String getColor(){return "绿色";}},blue{public String getColor(){return "蓝色";}};private String name;public void setName(String name){this.name = name;}public String getName(){return this.name;}public abstract String getColor();}
package org.enumdemo;public class EnumDemo07 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor (Color3 col:Color3.values()){System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getColor() );}}}
- Java Enum
- JAVA ENUM
- Java Enum
- JAVA ENUM
- Java Enum
- Java Enum
- Java Enum
- java enum
- java enum
- java Enum
- java enum
- Java enum
- Java Enum
- java enum
- Java Enum
- java enum
- Java Enum
- Java Enum
- STL学习系列之一——标准模板库STL介绍
- JUnit4学习笔记
- 分享一下我是如何切换 buffer 的吧
- LINQ语句表达式~~
- 不在WHERE子句中使用如ExitTime>GETDATE() - 10的日期运算语句大幅优化性能
- JAVA ENUM
- JRTP库与JTHREAD库的编译与移植
- Android Bluetooth Code
- Per-pixel lighting
- LA - 3027 - Corporative Network
- 程序员的自我修养 ch3 目标文件
- VS2010 如何调用 汇编写的dll库
- glibc内存碎片【转】
- HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。