首页 > 编程知识 正文

java带参数的枚举类型,java枚举转字符串

时间:2023-05-05 14:52:33 阅读:151154 作者:264

Java枚举(enum )详细信息: Java声明枚举类型、枚举)类、EnumMap和EnumSet声明枚举类将方法EnumMap和EnumSetEnumMap类EnumSet类添加到枚举中

枚举是整数常量的命名集合,声明一组具有标识符的常量。

在不胜枚举的生活中很常见。 例如,一个人的性别只有“男”或“女”,一周的星期只有7天中的一个等等。 这样,如果变量具有一些固定值,则可以将其定义为枚举类型。

在JDK 1.5之前没有枚举类型,但那时通常用接口常数进行替换。 使用Java枚举类型enum可以更精确地表示此常量。

枚举声明的枚举必须使用enum关键字,并定义枚举的名称、可访问性、基本类型和成员等。枚举声明的语法以下:

枚举修改名称:枚举基础{枚举,}其中枚举修改符主要是公共、私有和内部enumname表示声明的枚举名称。 enum-base表示基础类型; enum-body表示枚举的成员,是枚举类型的命名常量。

任意两个枚举成员不能使用相同的名称。 此外,常数值必须在枚举的基本类型范围内。 多个枚举成员之间请用逗号分隔。

提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

例 1

下面的代码定义了表示性别的枚举类型SexEnum和表示颜色的枚举类型Color :

public enum SexEnum{ male,female; }public enum Color{ RED,BLUE,GREEN,BLACK; }然后,可以直接按枚举类型名称引用SexEnum.male、Color.RED等常量。

枚举还使switch语句更易于阅读,如以下代码示例所示:

enum Signal{ //枚举类型GREEN,YELLOW,red } publicclasstrafficlight { signal color=signal.red; public void change () switch (color ) { case red : color=signal.green; 黑; case yellow : color=signal.red; 黑; case green : color=signal.yellow; 黑; }}枚举类Java中的每个枚举都继承自java.lang.Enum类。 定义枚举类型时,枚举类型的每个成员都可以被视为Enum类的实例。 这些枚举成员默认由final、public和static限定,使用枚举类型的成员时,只需直接使用枚举名称调用成员即可。

所有枚举实例都可以调用Enum类的方法。 一般方法如表1所示。

表1 Enum类的一般方法

方法名称说明values ) )以数组形式返回枚举类型的所有成员valueOf ) )将常规字符串转换为枚举实例compareTo ),并在两个枚举成员的索引位置例 2

可以调用枚举类型实例的values ()方法,将枚举的所有成员作为数组返回。 也可以获取枚举类型的成员。

下面的示例创建一个包含三个成员的枚举类型Signal,并调用values ()方法以输出这些成员:

定义枚举信号{//枚举类型GREEN,YELLOW,RED; } publicstaticvoidmain (string [ ] args ) for ) intI=0; iSignal.values ().length; I ) ({ System.out.println ) )枚举成员: ' Signal.values ) ) [i]; }输出结果如下。

枚举成员: GREEN枚举成员: YELLOW枚举成员: RED 例 3

调用valueOf (方法,compareTo )方法进行比较以获取枚举的成员,并创建输出结果的示例。 具体的实现代码如下

publicclasstestenum { publicenumsex {//枚举male,female; }公共静态

void main(String[] args) { compare(Sex.valueOf("male")); //比较 } public static void compare(Sex s) { for(int i=0;i<Sex.values().length;i++) { System.out.println(s+"与"+Sex.values()[i]+"的比较结果是:"+s.compareTo(Sex.values()[i])); } }}

上述代码中使用 Sex.valueOf(“male”) 取出枚举成员 male 对应的值,再将该值与其他枚举成员进行比较。最终输出结果如下:

male与male的比较结果是:0male与female的比较结果是:-1

例 4
通过调用枚举类型实例的 ordinal() 方法可以获取一个成员在枚举中的索引位置。下面的示例创建一个包含 3 个成员的枚举类型 Signal,然后调用 ordinal() 方法输出成员及对应索引位置。

具体实现代码如下:

public class TestEnum1{ enum Signal { //定义一个枚举类型 GREEN,YELLOW,RED; } public static void main(String[] args) { for(int i=0;i<Signal.values().length;i++) { System.out.println("索引"+Signal.values()[i].ordinal()+",值:"+Signal.values()[i]); } }}

输出结果如下:

索引0,值:GREEN索引1,值:YELLOW索引2,值:RED 为枚举添加方法

Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自己的方法。此时要注意必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。
例 5
下面的代码创建了一个枚举类型 WeekDay,而且在该类型中添加了自定义的方法。

enum WeekDay{ Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri("Friday"),Sat("Saturday"),Sun("Sunday"); //以上是枚举的成员,必须先定义,而且使用分号结束 private final String day; private WeekDay(String day) { this.day=day; } public static void printDay(int i) { switch(i) { case 1: System.out.println(WeekDay.Mon); break; case 2: System.out.println(WeekDay.Tue); break; case 3: System.out.println(WeekDay.Wed); break; case 4: System.out.println(WeekDay.Thu); break; case 5: System.out.println(WeekDay.Fri); break; case 6: System.out.println(WeekDay.Sat); break; case 7: System.out.println(WeekDay.Sun); break; default: System.out.println("wrong number!"); } } public String getDay() { return day; }}

上面代码创建了 WeekDay 枚举类型,下面遍历该枚举中的所有成员,并调用 printDay() 方法。示例代码如下:

public static void main(String[] args){ for(WeekDay day:WeekDay.values()) { System.out.println(day+"====>"+day.getDay()); } WeekDay.printDay(5);}

输出结果如下:

Mon====>MondayTue====>TuesdayWed====>WednesdayThu====>ThursdayFri====>FridaySat====>SaturdaySun====>SundayFri

Java 中的 enum 还可以跟 Class 类一样覆盖基类的方法。下面示例代码创建的 Color 枚举类型覆盖了 toString() 方法。

public class Test{ public enum Color { RED("红色",1),GREEN("绿色",2),WHITE("白色",3),YELLOW("黄色",4); //成员变量 private String name; private int index; //构造方法 private Color(String name,int index) { this.name=name; this.index=index; } //覆盖方法 @Override public String toString() { return this.index+"-"+this.name; } } public static void main(String[] args) { System.out.println(Color.RED.toString()); //输出:1-红色 }} EnumMap 与 EnumSet

为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。

EnumMap 类

EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。

HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。
例 6
下面是使用 EnumMap 的一个代码示例。枚举类型 DataBaseType 里存放了现在支持的所有数据库类型。针对不同的数据库,一些数据库相关的方法需要返回不一样的值,例如示例中 getURL() 方法。

//定义数据库类型枚举public enum DataBaseType{ MYSQUORACLE,DB2,SQLSERVER}//某类中定义的获取数据库URL的方法以及EnumMap的声明private EnumMap<DataBaseType,String>urls=new EnumMap<DataBaseType,String>(DataBaseType.class);public DataBaseInfo(){ urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample"); urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb"); urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample"); urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb");}//根据不同的数据库类型,返回对应的URL//@param type DataBaseType 枚举类新实例//@returnpublic String getURL(DataBaseType type){ return this.urls.get(type);}

在实际使用中,EnumMap 对象 urls 往往是由外部负责整个应用初始化的代码来填充的。这里为了演示方便,类自己做了内容填充。

从本例中可以看出,使用 EnumMap 可以很方便地为枚举类型在不同的环境中绑定到不同的值上。本例子中 getURL 绑定到 URL 上,在其他的代码中可能又被绑定到数据库驱动上去。

EnumSet 类

EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化,如表 2 所示。

表2 EnumSet 类的常用方法

方法名称描述allOf(Class element type)创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象complementOf(EnumSet s)创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,并包含所有 s 中未包含的枚举成员copyOf(EnumSet s)创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,并与 s 包含相同的枚举成员noneOf(<Class elementType)创建指定枚举类型的空 EnumSet 对象of(E first,e…rest)创建包含指定枚举成员的 EnumSet 对象range(E from ,E to)创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚举成员

EnumSet 作为 Set 接口实现,它支持对包含的枚举常量的遍历。

for(Operation op:EnumSet.range(Operation.PLUS,Operation.MULTIPLY)){ doSomeThing(op);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。