1. 在J2SE5.0中要定义枚举类型是使用enum关键词,枚举类型主要提供一些常数。如下列代码定义了Action枚举类型:
Java代码
public enum Action
{
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
在Action.java中编写此段代码并编译,虽然语法上不像是在定义类,但枚举类型本质上就是一个类。所以编译完成后,会产生一个Action.class文件。
下面的代码是说明如何使用定义好的枚举类型一个示例:
Java代码
public class EnumDemo
{
public static void main(String[] args)
{
doAction(Action.TURN_RIGHT);
}
public static void doAction(Action action)
{
switch(action)
{
case TURN_LEFT:
System.out.println("向左转");
break;
case TURN_RIGHT:
System.out.println("向右转");
break;
case SHOOT:
System.out.println("射击");
break;
}
}
}
运行结果:向右转。其中doAction()方法所接受的变量必须是Action枚举类型,如果对此方法输入其他类型的变量,编译器会报告错误。另外,如果在上面的switch中加入了不属于Action中枚举的值,编译器也会报告错误。例如:在上面代码case SHOOT段下面再加上以下代码:
case STOP:
System.out.println("STOP");
break;
则在编译时编译器会显示以下错误:
unqualified enumeration constant name required
case STOP:
^
2. 可以在一个独立的文件中声明枚举值,或是在某个类中声明枚举成员。例如:
Java代码
public class EnumDemo2
{
private enum InnerAction {TURN_LEFT,TURN_RIGHT,SHOOT};
public static void main(String[] args)
{
doAction(InnerAction.TURN_RIGHT);
}
public static void doAction(InnerAction action)
{
switch(action)
{
case TURN_LEFT:
System.out.println("向左转");
break;
case TURN_RIGHT:
System.out.println("向右转");
break;
case SHOOT:
System.out.println("射击");
break;
}
}
}
由于枚举类型本质上还是类,所以这段代码中枚举声明方式有些像在声明内嵌类。在编译完EnumDemo2.java后,会有一些额外的 .class文件产生,在此例中就是EnumDemo2$InnerAction.class与EnumDemo2$1.class。看到这两个文件,就可以知道实际上编译器产生了成员内部类和匿名内部类。
上面通过枚举类型设定常数的方式比旧版本的常数设定方式多了编译时期类型检查的好处。以下将深入讨论枚举类型的一些知识,以便深入理解。
2. 深入枚举类型:
定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。
如1中所定义的枚举类型Action,TURN_LEFT,TURN_RIGHT,SHOOT都是Action的一个对象实例。因为是对象,所以,对象上自然有一些方法可以调用。如从Object继承焉的toString()方法被重新定义了,可以让你直接取得枚举值的字符串描述;values()方法可以让您取得所有的枚举成员实例,并以数组方式返回。您可以使用这两个方法来简单的将Action的枚举成员显示出来。静态valueOf()方法可以让您将指定的字符串尝试转换为枚举类型。可以用compareTo()方法来比较两个枚举对象在枚举时的顺序。-1之前,0位置相同,1之后。对于每个枚举成员,使用ordinal()方法,依枚举顺序得到位置索引,默认以0开始。
3.枚举上的方法:定义枚举类型基本上就是在定义类,定义枚举类型时也可以定义方法。如可以为枚举加上一些描述,而不是使用默认的toString()返回值来描述枚举值。如下代码所示:
Java代码
public enum DetailAction
{
TURN_LEFT,TURN_RIGHT,SHOOT;
public String getDescription()
{
switch(this.ordinal())
{
case 0:
return "向左转";
case 1:
return "向右转";
case 2:
return "射击";
default:
return null;
}
}
}
可以用下面的代码测试所定义的方法是否可用。
Java代码
public class DetailActionDemo
{
public static void main(String[] args)
{
for(DetailAction action : DetailAction.values())
{
System.out.printf("%s: %s%n",action,action.getDescription());
}
}
}
运行结果:
TURN_LEFT: 向左转
TURN_RIGHT: 向右转
SHOOT: 射击
4.枚举类型既然是类,那么也就可以有构造函数。只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化。如下代码:
Java代码
enum DetailActioin2
{
TURN_LEFT("向左转"),TURN_RIGHT("向右转"),SHOOT("射击");
private String description;
//不公开的构造函数
private DetailActioin2(String description)
{
this.description = description;
}
public String getDescription()
{
return description;
}
}
非公开的构造函数最常见的一个例子就是singleton模式的应用,当某个类只能有一个实例时,可由类维护唯一的实例,这时可以将构造函数设定为私有,取用此类的开发人员就不能自行新增多个实例了。Singleton模式的简易版本代码如下:
Java代码
public class Singleton
{
//构造函数私有,只限内部调用
private SingleTon(){};
private static Singleton instance = null;
public static synchronized SingleTon getInstance()
{
if(instance == null)
instance = new Singleton();
return instance;
}
}
4. 因值而异的类实现(Value-Specific Class Bodies)
这个功能简单地说像是在使用匿名内部类来实现Command模式,它可以为每个枚举值定义各自的类本体与方法实现。
一种实现方式如下:
Java代码
public interface IDescription
{
public String getDescription();
}
public enum MoreAction implements IDescription
{
TURN_LEFT
{
//实现接口上的方法
public String getString() {return "向左转"}
}, //注意这里的枚举值分隔使用,
TURN_RIGHT
{
//实现接口上的方法
public String getString() {return "向右转"}
}, //注意这里的枚举值分隔使用,
SHOOT
{
//实现接口上的方法
public String getString() {return "射击"}
}; //注意这里的枚举值结束使用;
}
每个枚举成员的{与}之间是类本体,还可以在其中如同定义类一样地声明数据成员或者数据方法。测试这段代码的程序如下:
Java代码
public class MoreActionDemo
{
public static void main(String[] args)
{
for(MoreAction action : MoreAction.values())
{
System.out.printf("%s: %s%n",action,action.getDescription());
}
}
}
这个例子是将因值而异的类实现用在返回枚举值的描述上,可以按照相同的方式,为每个枚举值加上一些各自的方法实现,而调用的接口是统一的。执行结果如下:
D:\Java_Test>javac IDescription.java
D:\Java_Test>javac MoreAction.java
D:\Java_Test>javac MoreActionDemo.java
D:\Java_Test>java MoreActionDemo
TURN_LEFT: 向左转
TURN_RIGHT: 向右转
SHOOT: 射击
可能是利用枚举类型实现的接口中的方法,这里直接用
D:\Java_Test>javac IDescription.java 编译时会提示找不到getDescription()方法,所以,只好挨个来编译了。
也可以运用抽象方法去改写上面的MoreAction.java,如下:
Java代码
public enum MoreAction2
{
TURN_LEFT{
//实现抽象方法
public String getDescription()
{
return "向左转";
}
}, //记得这里的枚举值分隔使用,
TURN_RIGHT{
//实现抽象方法
public String getDescription()
{
return "向右转";
}
},
SHOOT{
//实现抽象方法
public String getDescription()
{
return "射击";
}
}; //记得这里的枚举值结束使用;
//声明抽象方法
public abstract String getDescription();
}
执行结果与上面相同。
分享到:
相关推荐
总结来说,Java枚举类型提供了一种安全、类型安全的方式来定义和使用常量,它可以拥有构造器、方法和字段,并能与switch语句、序列化、反射等Java特性很好地结合。理解并熟练使用枚举,能够使代码更加清晰、易读,...
下面通过一个具体的例子来说明如何使用Java枚举类型: ```java public enum Grade { A, B, C, D, F, INCOMPLETE; public String getDescription() { switch (this) { case A: return "优秀"; case B: ...
Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...
Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...
总结起来,Java枚举类型是一个强大的工具,它可以替代`static final`常量来表示一组固定的值,提供类型安全、易于维护的代码。通过枚举,我们可以更方便地管理常量,减少错误,并增加代码的灵活性。枚举是Java中一个...
一个关于JAVA枚举类型的MHT文件,包含JAVA枚举类型的用法,以及JDK版本的问题。
Java 中使用关键字 enum 来定义一个枚举类型。例如: ```java public enum Season { SPRING, SUMMER, AUTUMN, WINTER; } ``` 特点 Java 定义枚举类型的语句很简约。它有以下特点: 1. 使用关键字 enum 2. 类型...
下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...
### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...
Java枚举提供了一种强大的方式来定义和管理一组相关的常量。它们不仅可以存储数据,还可以包含方法,实现接口,甚至使用构造器进行初始化。枚举的这些特性使其在设计模式、数据模型、状态机等多种场景中都有广泛应用...
总的来说,Java枚举提供了一种强类型、安全且易于使用的机制来表示固定集合的值。通过枚举,我们可以更好地组织代码,减少错误,并提升程序的可维护性。在JavaDemo项目中,可能包含了各种使用枚举的示例,包括但不...
java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>
Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
- **成员变量**:枚举类型中的每个成员都是一个实例,可以直接通过枚举类型名访问。 - **方法**:枚举可以像普通类一样包含方法,包括构造器、实例方法和静态方法。 - **自动实现接口**:枚举类型会自动实现`java....
在本压缩包中,"Java 枚举类型案例"可能包含了多个示例,以帮助我们深入理解Java枚举类型的使用。 1. **枚举的定义** 在Java中,枚举是通过关键字`enum`来定义的。例如,创建一个表示星期的枚举类型: ```java ...
JAVA枚举类型[归纳].pdf
枚举类型还可以与其他集合框架结合使用,例如`EnumSet`和`EnumMap`。`EnumSet`是专为枚举设计的高效集合,而`EnumMap`则是一个以枚举类型为键的映射表。 在枚举类型中,还可以定义抽象方法,所有枚举常量必须实现...
### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。