当前位置: 首页 > 编程笔记 >

浅谈Java枚举的作用与好处

丁兴德
2023-03-14
本文向大家介绍浅谈Java枚举的作用与好处,包括了浅谈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 = 
} 

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的一些高级特性,否则就和简单易懂的初衷想违背了。

以上这篇浅谈Jave枚举的作用与好处就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍深入谈谈java的枚举(enum)类型,包括了深入谈谈java的枚举(enum)类型的使用技巧和注意事项,需要的朋友参考一下 前言 在大家日常编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在java中如何更好的使用这些“数据集”呢?因此枚

  • 本文向大家介绍浅谈java String不可变的好处,包括了浅谈java String不可变的好处的使用技巧和注意事项,需要的朋友参考一下 一、java内部String类的实现: java 8: java 9 及之后:(使用coder标识了编码) 二、为何要将String定义为final不可变? 因为在程序编写的过程中,会大量地用到String常量,如果每次声明一个String引用都要新建一个St

  • 本文向大家介绍谈谈你可能并不了解的java枚举,包括了谈谈你可能并不了解的java枚举的使用技巧和注意事项,需要的朋友参考一下 前言 枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型: 当然今天我们要探讨的并非是java中enum的基础语法,本次的主题将会深入enum的本质,并探讨部分高阶用法。本文基于Oracle JDK 14.0.2和jad v

  • 本文向大家介绍Java枚举与.net枚举区别详解,包括了Java枚举与.net枚举区别详解的使用技巧和注意事项,需要的朋友参考一下 通过一段时间的项目实践,发现java中的枚举与.net中的枚举有很大的差别,初期造成了我对java中的枚举一些错误理解及部分有缺陷的应用,其实追其原因还是因为我会习惯性的认为java的枚举在作用以及定义上与.net应该是差不多的,毕竟两者都是高级语言,语言上也有很多相

  • 本文向大家介绍浅析Java编程中枚举类型的定义与使用,包括了浅析Java编程中枚举类型的定义与使用的使用技巧和注意事项,需要的朋友参考一下 定义枚举类型时本质上就是在定义一个类,只不过很多细节由编译器帮您补齐了,所以某些程度上,enum关键字的 作用就像是class或interface。 当您使用"enum"定义枚举类型时,实质上您定义出来的类型继承自 java.lang.Enum 类,而每个枚举

  • 问题内容: Java Enum类的文档声明以下内容: 返回与此枚举常量的枚举类型相对应的Class对象。当且仅当e1.getDeclaringClass()== e2.getDeclaringClass()时,两个枚举常量e1和e2属于相同的枚举类型。(对于具有特定于常量的类主体的枚举常量,此方法返回的值可能不同于Object.getClass()方法返回的值。) 我不了解何时和与众不同。有人可以