javaintenum
Ⅰ java 中 Enum 如何继承
Java Enum是不能继承的,以下是解释:
枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。枚举类的内部定义的枚举值就是该类的实例(且必须在第一行定义,当类初始化时,这些枚举值会被实例化)。
Java 5新增的enum关键词,可以定义枚举类。该类是一个特殊的类,可以定义自己的field、方法、可以实现接口,也可以定义自己的构造器。
Ⅱ java中为何使用一系列的常量来代替enum
可能是android的设计人员觉得这样简单方便吧,不用去创建一个枚举类型。个人比较推荐用枚举。一看就知道是一类的东西。
Ⅲ 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中的枚举到底有什么作用
枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念 枚举像一个类,又像一个数组。
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
了解了这些基本特性,我们来看看如何使用它们。
1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
public enum Color {
Red,
Green,
Blue;
private static int number = Color.values().length ;
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
4.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
Ⅳ java怎么传递enum值给c++
1、为什么要用enum
写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny,
cloudy,
rainy等等。
更常见的,打开一个文件可能有三种状态:input,
output和append.
典型做法是,对应定义3个常数,即:
const
int
input
=
1;
const
int
output
=
2;
const
int
append
=
3;
然后,调用以下函数:
bool
open_file(string
file_name,
int
open_mode);
比如,
open_file("Phenix_and_the_Crane",
append);
这种做法比较简单,但存在许多缺点,主要的一点就是无法限制传递给open_file函数的第2个参数的取值范围,只要传递int类型的值都是合法的。(当然,这样的情况下的应对措施就是在open_file函数内部判断第二个参数的取值,只有在1,2,3范围内才处理。)
使用枚举能在一定程度上减轻这种尴尬(注1),它不但能实现类似于之前定义三个常量的功能,还能够将这三个值组合起来成为独一无二的组。例如:
enum
open_modes
{input
=
1,
output,
append};
以上定义了open_modes为枚举类型enumeration
type。每一个命名了的枚举都是唯一的类型,是一个类型标示器type
specifier。例如,我们可以重新写一个open_file函数:
bool
open_file(string
file_name,
open_modes
om);
在open_modes枚举中,input,
output,
append称为枚举子enumerator,
它们限定了open_modes定义的对象的取值范围。这个时候,调用open_file函数和之前的方法还是一模一样:
open_file("Phenix_and_the_Crane",
append);
但是,如果传递给open_file的第二个参数不是open_modes枚举类型值的话(注1),那么编译器就会识别出错误;就算该参数取值等价于input,
output,
append中的某个,
也一样会出错哦!例如:
open_file("Phenix_and_the_Crane",
1);
转载,仅供参考。
Ⅵ 为什么Java中使用枚举enum不如使用静态类
两个方面,一个是心理上,一个是程序上
1、枚举从外观上就能表达他是作为“众多备选项中的一个”的身份存在的,程序员看到枚举就能直接获得这个信息。
2、枚举是不会出现无意错误的,比如static final int OK= 1;
你在代码里其实可以直接写if (result == 1),而不一定非要写if (result == OK)
但是枚举你就不能这样
Ⅶ java中的枚举类型怎么定义
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
了解了这些基本特性,我们来看看如何使用它们。
1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
public enum Color {
Red,
Green,
Blue;
/*
*定义一个变量表示枚举值的数目。
*(我有点奇怪为什么sun没有给enum直接提供一个size方法).
*/
private static int number = Color.values().length ;
/**
* 随机返回一个枚举值
@return a random enum value.
*/
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
4.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
Ⅷ enum在java中是什么意思
Enum 类型的介绍
枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。
举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现。
清单 1. 常量定义
PublicstaticclassRainbowColor{
//红橙黄绿青蓝紫七种颜色的常量定义
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("'s");
}elseif(day.equals(WeekDayEnum.Fri)){
System.out.println("'s");
}else{
System.out.println("'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 来实现。
Ⅸ ENUM的Enum的用法(JAVA版)
引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都会自动获得一个数字值,从0开始,依次递增.看一个比较简单的enum实现的例子: EnumDemo.javapackagenet.javagarage.enums;/*()method.,calledEnumDemo$Seasons.class*/publicclassEnumDemo{/*.notethat,likein#,wedon'tsea‘;’*/privateenumSeasons{winter,spring,summer,fall}//(String[]args){for(Seasonss:Seasons.values()){System.out.println(s);}}}运行上述代码你会得到 以下结果:
winter
spring
summer
fall 下面的代码展示了调用enum对象的方法,这也是它通常的用法: packagenet.javagarage.enums;/*File:EnumSwitch.javaPurpose:.*/publicclassEnumSwitch{privateenumColor{red,blue,green}//(String[]args){//refertothequalifiedvaluedoIt(Color.red);}/*.thatis,caseColor.red:isacompilererror*/privatestaticvoiddoIt(Colorc){switch(c){casered:System.out.println(valueis+Color.red);break;casegreen:System.out.println(valueis+Color.green);break;caseblue:System.out.println(valueis:+Color.blue);break;default:System.out.println(default);}}}为Enums添加属性和方法
enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样.
就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错.
Enums构造函数:
和类一样enums也可以有自己的构造函数
尽管enums有这么多的属性,但并不是用的越多越好,如果那样还不如直接用类来的直接.enums的优势在定义int最终变量仅当这些值有一定特殊含义时.但是如果你需要的是一个类,就定义一个类,而不是enum.
Ⅹ java enum是一个引用还是一个值类型
在C#中算是值类型,但在Java中算引用。