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的一些高级特性,否则就和简单易懂的初衷想违背了。
分享到:
相关推荐
valueOf(String arg0) 方法是枚举类中的一个静态方法,它通过传入的 arg0 字符串解析出一个该枚举类的实例,其中传入的字符串必须是元素列表的名称之一,否则将抛出 java.lang.IllegalArgumentException 异常。...
在某些情况下,可能需要定义一个大型的枚举集合,这时可以使用枚举类(enum class,C++11引入)来限制枚举常量的作用域,提高代码的封装性。但在C语言中,没有这样的特性,所有枚举常量都是全局的。 7. 枚举与枚举...
标题"7enum枚举字函数程序案例VC共4页.pdf.zip"表明这是一个关于使用VC++(Visual C++)编程环境的7enum枚举字函数的程序案例,内容共有4页,被压缩在一个PDF文档中。7enum通常指的是一个用于安全审计和漏洞评估的...
解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类 ZipInputStream实现压缩文件的读取与数据转化的过程,利用反射实现根据枚举值获取枚举对象。
本篇将详细介绍如何利用枚举(enum)来实现单例模式,并结合`Properties`类解析配置文件。 首先,我们来看一下传统的单例模式实现方式,如懒汉式和饿汉式,但这些方法在多线程环境下可能会存在问题。而使用枚举实现...
- 枚举工具类:有时,我们可能会创建一个工具类来处理与枚举相关的通用任务,比如验证枚举值的合法性,或者提供枚举的解析和生成等功能。 6. **枚举与switch语句**: - 在Java中,枚举类型可以无缝地与`switch`...
一旦我们有了枚举的名称和值,就可以使用C#的`enum`关键字来创建枚举类型。 同时,生成方法的部分可能涉及动态创建委托或实现特定接口。这需要用到C#的反射和元数据功能,通过`Type`类和`MethodInfo`类来创建和操作...
Genum是从YAML数组生成Java枚举类文件的代码生成器。 您可以在服务器端和客户端应用程序之间共享定义! 例如,这是一个以YAML格式编写的数组。 - Tokyo - NewYork - London - Beijing - Paris - Roma Genum将其...
`read()`方法负责将JSON解析为枚举值,而`write()`方法则将枚举值转化为JSON。下面是一个基本示例: ```java import com.google.gson.*; public class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T>...
1. **自动继承Enum类**:所有枚举都是`java.lang.Enum`的子类,这意味着枚举类具有内置的方法,如`values()`(返回枚举常量数组)和`valueOf(String)`(根据名称返回枚举常量)。 2. **单例性**:每个枚举常量都是一...
C语言是一种广泛使用的计算机编程语言,具有以下特点: 1. **高级语言**:C语言是一种高级编程语言,设计用于编写系统软件和应用程序。 2. **结构化语言**:C语言支持结构化编程,允许使用条件语句、循环、函数等...
这样,当后端接收到前端的枚举名称后,可以直接将它解析为对应的枚举值,反之亦然。 其次,对于数据库操作,枚举类型可以用于ORM框架如Hibernate的实体属性。在持久化枚举到数据库时,通常将枚举的`ordinal()`值或...
`DNS-ENUM.rar_ENUM/DNS_dns_enum 域名解析`这个压缩包文件包含了关于DNS枚举和域名解析的相关工具或代码实现,这通常涉及到网络安全分析、漏洞检测或网络监控等领域。 1. **DNS枚举**: DNS枚举是一种网络安全...
在Java中,枚举(enum)类型是一种特殊的类,它定义了一组有限的常量。枚举类型提供了一种更清晰、更安全的方式来处理一组固定的常量值。本文将深入探讨Java枚举类型的特点、用法以及最佳实践。 Java中的枚举类型是...
本文深入探讨了 C++ 中enum class(强类型枚举)和传统enum(普通枚举)的特性、用法、区别以及各自的适用场景。通过详细的代码示例、语法分析和实际应用案例,帮助读者全面理解这两种枚举类型在类型安全性、作用域...
Java 枚举类使用场景及实例解析 Java 枚举类是 Java 语言中的一种特殊的引用类型,它是一种特殊的类(Class),从 JDK 1.5 开始引入枚举类型。枚举类可以解决 int 和 String 枚举模式带来的诸多不足,保证了编译时...
枚举类还可以添加其他方法,如解析字符串到枚举值,或者根据文件扩展名获取MIME类型等。例如,创建一个静态方法`fromString`来根据MIME类型字符串获取枚举值: ```java public static MimeType fromString(String...
在Java开发中,枚举类型(Enum)常用于表示固定数量的状态或选项,以替代硬编码的常量,提供更好的可读性和类型安全。Jackson是一个流行的JSON处理库,它允许我们将Java对象序列化为JSON格式,反之亦然。在序列化...
Java 枚举类接口实例原理解析 Java 枚举类接口实例原理解析是 Java 编程语言中的一种重要概念。枚举类是一种特殊的类,它可以实现一个或多个接口。枚举类的实现接口时,需要实现该接口所包含的方法。如果需要每个...