JAVA 枚举

本文详细介绍了Java枚举的功能和特性,包括枚举值的属性、内置方法、自定义方法及实现接口等内容,并通过示例展示了如何更好地利用枚举。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
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我们怎么做呢。其实这和覆载一个普通classtoString方法没有什么区别。
….
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 enum Color {
Red 

public String toString()
{
return "Color.Red"
;
}

}
,
Green 
{
public String toString()
{
return "Color.Green"
;
}

}
,
Blue
{
public String toString()
{
return "Color.Blue"
;
}


}

}

, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

5
.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。


6
.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
从逻辑上来说这样比原先提供一个全局toString方法要清晰一些。


总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
### Java 枚举的概念与使用方法 #### 什么是枚举? 在 Java 中,`enum` 是一种特殊的数据类型,用于定义一组固定的常量集合。通过使用 `enum`,可以提高代码的可读性和安全性。 #### 创建和使用枚举 以下是创建和使用枚举的基本方式: ```java public enum Color { RED, GREEN, BLUE; } ``` 上述代码定义了一个名为 `Color` 的枚举类,其中包含三个常量:`RED`, `GREEN`, 和 `BLUE`[^1]。 可以通过以下方式访问这些枚举值: ```java System.out.println(Color.RED); // 输出: RED ``` #### 单例模式中的应用 Java 枚举天然支持单例设计模式。由于每个枚举常量在整个 JVM 生命周期中仅存在一个实例,因此可以直接利用这一特性实现线程安全的单例模式。 示例如下: ```java public enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println("Singleton doing something..."); } } // 调用单例方法 SingletonEnum.INSTANCE.doSomething(); ``` 此代码展示了如何通过枚举来实现单例模式,并调用其方法。 #### 序列化与反序列化的处理 当枚举被序列化后再进行反序列化时,JVM 确保返回的是原始的枚举实例而非新创建的对象。这进一步增强了枚举作为单例使用的可靠性。 #### 遍历枚举值 每一个枚举都隐含提供了一个静态方法 `values()`,该方法能够返回按声明顺序排列的所有枚举常量组成的数组。配合增强型 for 循环即可轻松遍历所有可能取值。 示例代码如下: ```java for (Color color : Color.values()) { System.out.println(color); } ``` 这段程序会依次输出 `RED`, `GREEN`, 和 `BLUE`[^3]。 #### 方法重载于枚举 除了简单的命名外,还可以给枚举添加字段以及构造器,甚至自定义行为逻辑的方法。 例子展示带参数的复杂枚举结构及其操作函数: ```java public enum Planet { MERCURY(3.30E23), VENUS(4.87E24), EARTH(5.98E24); private final double mass; // kilograms Planet(double mass) { this.mass = mass; } public double getMass() { return mass; } } Planet earth = Planet.EARTH; System.out.printf("Earth's mass is %.2f kg%n", earth.getMass()); ``` 这里我们不仅限定了行星名称还附加了质量属性并通过 getter 访问[^2]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值