首页编程java编程java enum什么时候加载?enum在java中是什么意思

java enum什么时候加载?enum在java中是什么意思

编程之家2023-10-11114次浏览

各位老铁们好,相信很多人对java enum什么时候加载都不是特别的了解,因此呢,今天就来为大家分享下关于java enum什么时候加载以及enum在java中是什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

java enum什么时候加载?enum在java中是什么意思

Java中错误: 需要class, interface或enum

1,class既代表类,又代表定义类的关键字。“需要class”可能是定义一个类却缺失了关键字class,也可能是需要一个类而没有定义,但多半是前者。 2,interface是表示一个类要实现一个接口。“需要interface”可能是类要实现一个接口而缺失了关键字interface。 3,enum是枚举,这是一种数据类型,可能是定义了这个类型而缺失了这个关键字,才会产生“需要enum”的错误

enum在java中是什么意思

Enum类型的介绍

枚举类型(Enumerated Type)很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。

java enum什么时候加载?enum在java中是什么意思

举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java程序中通过常量定义方式来实现。

清单 1.常量定义

PublicstaticclassRainbowColor{

java enum什么时候加载?enum在java中是什么意思

//红橙黄绿青蓝紫七种颜色的常量定义

publicstaticfinalintRED=0;

publicstaticfinalintORANGE=1;

publicstaticfinalintYELLOW=2;

publicstaticfinalintGREEN=3;

publicstaticfinalintCYAN=4;

publicstaticfinalintBLUE=5;

publicstaticfinalintPURPLE=6;

}

使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。

类型不安全

由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错误。

没有命名空间

由于颜色常量只是类的属性,当你使用的时候不得不通过类来访问。

一致性差

因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。

类型无指意性

由于颜色枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。

如何定义 Enum类型

为了改进 Java语言在这方面的不足弥补缺陷,5.0版本 SDK发布时候,在语言层面上增加了枚举类型。枚举类型的定义也非常的简单,用 enum关键字加上名称和大括号包含起来的枚举值体即可,例如上面提到的彩虹颜色就可以用新的 enum方式来重新定义:

enumRainbowColor{RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE}

从上面的定义形式来看,似乎 Java中的枚举类型很简单,但实际上 Java语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。另外,Java平台也为 Enum类型提供了高质量的实现,比如默认实现 Comparable和 Serializable接口,让开发者一般情况下不用关心这些细节。

回到本文的主题上来,引入枚举类型到底能够给我们开发带来什么样好处呢?一个最直接的益处就是扩大 switch语句使用范围。5.0之前,Java中 switch的值只能够是简单类型,比如 int、byte、short、char,有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:

清单 2.定义 Enum类型

//定义一周七天的枚举类型

publicenumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}

//读取当天的信息

WeekDayEnumtoday=readToday();

//根据日期来选择进行活动

switch(today){

Mon:dosomething;break;

Tue:dosomething;break;

Wed:dosomething;break;

Thu:dosomething;break;

Fri:dosomething;break;

Sat:playsportsgame;break;

Sun:havearest;break;

}

对于这些枚举的日期,JVM都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch语句就根据此来进行执行跳转。

如何定制 Enum类型

除了以上这种最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class的定义来给枚举进行定制。比如要给 enum类型增加属性,可以像下面这样定义:

清单 3.定制枚举类型

//定义RSS(ReallySimpleSyndication)种子的枚举类型

publicenumNewsRSSFeedEnum{

//雅虎头条新闻RSS种子

YAHOO_TOP_STORIES("http://rss.news.yahoo.com/rss/topstories"),

//CBS头条新闻RSS种子

CBS_TOP_STORIES("http://feeds.cbsnews.com/CBSNewsMain?format=xml"),

//洛杉矶时报头条新闻RSS种子

LATIMES_TOP_STORIES("http://feeds.latimes.com/latimes/news?format=xml");

//枚举对象的RSS地址的属性

privateStringrss_url;

//枚举对象构造函数

privateNewsRSSFeedEnum(Stringrss){

this.rss_url=rss;

}

//枚举对象获取RSS地址的方法

publicStringgetRssURL(){

returnthis.rss_url;

}

}

上面头条新闻的枚举类型增加了一个 RSS地址的属性,记录头条新闻的访问地址。同时,需要外部传入 RSS访问地址的值,因而需要定义一个构造函数来初始化此属性。另外,还需要向外提供方法来读取 RSS地址。

如何避免错误使用 Enum

不过在使用 Enum时候有几个地方需要注意:

enum类型不支持 public和 protected修饰符的构造方法,因此构造函数一定要是 private或 friendly的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。

定义 enum类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。

由于 enum类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号(‘==’)操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

看下面的这个例子:

清单 4.避免错误使用 Enum示例

//定义一个一周七天的枚举类型

packageexample.enumeration.codes;

publicenumWeekDayEnum{

Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sat(6),Sun(7);

privateintindex;

WeekDayEnum(intidx){

this.index=idx;

}

publicintgetIndex(){

returnindex;

}

}

//客户端程序,将一个枚举值通过网络传递给服务器端

packageexample.enumeration.codes;

importjava.io.IOException;

importjava.io.ObjectOutputStream;

importjava.io.OutputStream;

importjava.net.InetSocketAddress;

importjava.net.Socket;

importjava.net.UnknownHostException;

publicclassEnumerationClient{

publicstaticvoidmain(String...args)throwsUnknownHostException,IOException{

Socketsocket=newSocket();

//建立到服务器端的连接

socket.connect(newInetSocketAddress("127.0.0.1",8999));

//从连接中得到输出流

OutputStreamos=socket.getOutputStream();

ObjectOutputStreamoos=newObjectOutputStream(os);

//将星期五这个枚举值传递给服务器端

oos.writeObject(WeekDayEnum.Fri);

oos.close();

os.close();

socket.close();

}

}

//服务器端程序,将从客户端收到的枚举值应用到逻辑处理中

packageexample.enumeration.codes;

importjava.io.*;

importjava.net.ServerSocket;

importjava.net.Socket;

publicclassEnumerationServer{

publicstaticvoidmain(String...args)throwsIOException,ClassNotFoundException{

ServerSocketserver=newServerSocket(8999);

//建立服务器端的网络连接侦听

Socketsocket=server.accept();

//从连接中获取输入流

InputStreamis=socket.getInputStream();

ObjectInputStreamois=newObjectInputStream(is);

//读出客户端传递来的枚举值

WeekDayEnumday=(WeekDayEnum)ois.readObject();

//用值比较方式来对比枚举对象

if(day==WeekDayEnum.Fri){

System.out.println("clientFridayenumvalueissameasserver's");

}elseif(day.equals(WeekDayEnum.Fri)){

System.out.println("clientFridayenumvalueisequaltoserver's");

}else{

System.out.println("clientFridayenumvalueisnotsameasserver's");

}

//用switch方式来比较枚举对象

switch(day){

caseMon:

System.out.println("DoMondaywork");

break;

caseTue:

System.out.println("DoTuesdaywork");

break;

caseWed:

System.out.println("DoWednesdaywork");

break;

caseThu:

System.out.println("DoThursdaywork");

break;

caseFri:

System.out.println("DoFridaywork");

break;

caseSat:

System.out.println("DoSaturdaywork");

break;

caseSun:

System.out.println("DoSundaywork");

break;

default:

System.out.println("Idon'tknowwhichisday");

break;

}

ois.close();

is.close();

socket.close();

}

}

打印结果如下:

client Friday enum value is same as server's

Do Friday work

通过程序执行结果,我们能够发现在分布式条件下客户端和服务端的虚拟机上都生成了一个枚举对象,即使看起来一样的 Fri枚举值,如果使用等号‘==’进行比较的话会出现不等的情况。而 switch语句则是通过 equal方法来比较枚举对象的值,因此当你的枚举对象较复杂时候,你就需要小心 override与比较相关的方法,防止出现值比较方面的错误。

Enum相关工具类

JDK5.0中在增加 Enum类的同时,也增加了两个工具类 EnumSet和 EnumMap,这两个类都放在 java.util包中。EnumSet是一个针对枚举类型的高性能的 Set接口实现。EnumSet中装入的所有枚举对象都必须是同一种类型,在其内部,是通过 bit-vector来实现,也就是通过一个 long型数。EnumSet支持在枚举类型的所有值的某个范围中进行迭代。回到上面日期枚举的例子上:

enumWeekDayEnum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}

你能够在每周七天日期中进行迭代,EnumSet类提供一个静态方法 range让迭代很容易完成:

for(WeekDayEnumday:EnumSet.range(WeekDayEnum.Mon,WeekDayEnum.Fri)){

System.out.println(day);

}

打印结果如下:

Mon

Tue

Wed

Thu

Fri

EnumSet还提供了很多个类型安全的获取子集的 of方法,使你很容易取得子集:

EnumSet<WeekDayEnum>subset=EnumSet.of(WeekDayEnum.Mon,WeekDayEnum.Wed);

for(WeekDayEnumday:subset){

System.out.println(day);

}

打印结果如下:

Mon

Wed

与 EnumSet类似,EnumMap也是一个高性能的 Map接口实现,用来管理使用枚举类型作为 keys的映射表,内部是通过数组方式来实现。EnumMap将丰富的和安全的 Map接口与数组快速访问结合到一起,如果你希望要将一个枚举类型映射到一个值,你应该使用 EnumMap。看下面的例子:

清单 5. EnumMap示例

//定义一个EnumMap对象,映射表主键是日期枚举类型,值是颜色枚举类型

privatestaticMap<WeekDayEnum,RainbowColor>schema=

newEnumMap<WeekDayEnum,RainbowColor>(WeekDayEnum.class);

static{

//将一周的每一天与彩虹的某一种色彩映射起来

for(inti=0;i<WeekDayEnum.values().length;i++){

schema.put(WeekDayEnum.values()[i],RainbowColor.values()[i]);

}

}

System.out.println("Whatistheluckycolortoday?");

System.out.println("It's"+schema.get(WeekDayEnum.Sat));

当你询问周六的幸运色彩时候,会得到蓝色:

清单 6.运行结果

What is the lucky color today?

It's BLUE

结束语

Enum类型提出给 JAVA编程带了了极大的便利,让程序的控制更加的容易,也不容易出现错误。所以在遇到需要控制程序流程时候,可以多想想是否可以利用 enum来实现。

java的enum到底有什么用

1.关于 Java Enum

Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较时候可以用”==”来替换 equals。是一种好的习惯。 JDK1.5之前没有 Enum这个类型,那时候一般用接口常量来替代。有了 JavaEnum之后,可以更贴近的表示这种常量。

2.如何使用 Java Enum

简单的用法: JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:

//性别

publicenumSexEnum{

male,female;

}

//颜色

publicenumColor{

RED,BLUE,GREEN,BLACK;

}

枚举对象里面的值都必须是唯一的。

可以通过 Enum类型名直接引用该常量,如 SexEnum.male,Color.RED.

复杂用法: Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象,看个下面的例子:

WeekDay.java

/**

*@authoradmin

*2015-12-03

*定义一个枚举类型,代表星期一到星期日的7个缩写常量

*同时还定义了枚举类型的属性day,该属性可以是final,也可是变量

*同时还定义了该枚举类型的一个方法printDay

*/

publicenumWeekDay{

Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri(

"Friday"),Sat("Saturday"),Sun("Sunday");

/**定义枚举类型自己的属性**/

privatefinalStringday;

privateWeekDay(Stringday){

this.day=day;

}

/**定义枚举类型自己的方法**/

publicstaticvoidprintDay(inti){

switch(i){

case1:System.out.println(WeekDay.Mon);break;

case2:System.out.println(WeekDay.Tue);break;

case3:System.out.println(WeekDay.Wed);break;

case4:System.out.println(WeekDay.Thu);break;

case5:System.out.println(WeekDay.Fri);break;

case6:System.out.println(WeekDay.Sat);break;

case7:System.out.println(WeekDay.Sun);break;

default:System.out.println("wrongnumber!");

}

}

publicStringgetDay(){

returnday;

}

}

WeekDayTest.java

/**

*@authoradmin

*2015-12-03

*测试枚举类型WeekDay.

*/

publicclassWeekDayTest{

publicstaticvoidmain(Stringargs[]){

for(WeekDayday:WeekDay.values()){

System.out.println(day+"====>"+day.getDay());

}

WeekDay.printDay(5);

}

}

输出结果为:

Mon====>Monday

Tue====>Tuesday

Wed====>Wednesday

Thu====>Thursday

Fri====>Friday

Sat====>Saturday

Sun====>Sunday

Fri

文章分享结束,java enum什么时候加载和enum在java中是什么意思的答案你都知道了吗?欢迎再次光临本站哦!

javaapi用什么打开,java的api在哪里绢云母(绢云母片岩)