<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
H1 { margin-left: 0.16cm; margin-right: 0.16cm; margin-top: 0.16cm; margin-bottom: 0.16cm; background: #ffffff; color: #000000; background: #ffffff }
H1.western { font-family: "Verdana"; font-size: 18pt }
H1.cjk { font-family: "Verdana"; font-size: 16pt; font-style: normal; font-weight: bold }
H1.ctl { font-family: "Verdana"; font-size: 16pt; font-weight: bold }
H2 { margin-left: 0.16cm; margin-right: 0.16cm; margin-top: 0.16cm; margin-bottom: 0.16cm; background: #ffffff; color: #000000; background: #ffffff }
H2.western { font-family: "Verdana"; font-size: 14pt; font-style: italic }
H2.cjk { font-family: "Verdana"; font-size: 14pt; font-style: italic }
H2.ctl { font-family: "Verdana"; font-size: 14pt; font-style: italic }
-->
Java的Enum要比C++复杂多了。因为这是一个类,可以享受类的强大功能,同时又有不少限制。
为什么使用enum而不是int
enumpattern或者string
enum pattern
int enum pattern
public
static final int APPLE_FUJI= 0;
public
static final int APPLE_PIPPIN= 1;
public
static final int APPLE_GRANNY_SMITH = 2;
public
static final int ORANGE_NAVEL = 0;
public
static final int ORANGE_TEMPLE = 1;
public
static final int ORANGE_BLOOD = 2;
缺点:
1.因为都是int类型,所以如果你在需要ORANGE_NAVEL的地方不小心传递了APPLE_FUJI,编译器不会报错。但是Enum类型是完全不一样的,编译器一定会报错。
2.同样,由于都是int类型,可以用operator==比较这两个逻辑上完全不相关的变量。编译器仍然不会报错。
3.更糟糕的是,我们可以当使用int变量一样的进行数学计算
//
Tasty citrus flavored applesauce!
int
i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN;
4.我们必须用前缀来区分不同的ENUM类型,因为没有namespace。
5.编译时约束会导致未定义行为。使用int值发生了变化,客户程序必须重新编译,否则结果未定义。
这条个人觉得倒不是多大问题。
6.没什么容易的方法获得表示枚举值的字符串表示。
String enum
pattern
缺点:
1.由于依赖字符串比较,会导致性能问题。
2.用户很容易使用hard-code的字符串常量,而不采用你想要他们使用的string
enum pattern。编译的时候无法察觉,但是到了运行的时候,缺容易出错。字符串拼写错误是常见的错误。
enum type
请看下面两个最简单的枚举类型定义。
public
enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public
enum Orange { NAVEL, TEMPLE, BLOOD }
特性(优点):
1.构造函数是不可以被客户程序调用的,因此不能用来创建对象(实例)。构造函数是允许定义的,但是只能在Enum内部像下面这样使用:
public
enum Ensemble {
SOLO(1),
DUET(2);
private
final int numberOfMusicians;
Ensemble(int
size) {
this.numberOfMusicians
= size;
}
}
2.枚举类型是真正的final类型,不能被继承(extends),
3.枚举类型的实例是受控的,因为不能被创建,所以如果Apple枚举只有一个
实例FUJI,这种单元素枚举就是最好的Singleton的实现。线程安全,只是不支持继承体系下的Singleton。
4.枚举类型提供了编译时的类型安全检查。客户程序不会出现传递int或者String常量来替代枚举常量的情况。
5.调整enum常量的值或者顺序不会要求客户端程序重新编译。因为客户端并不关心enum常量的值。
6.实现了Comparable接口
7.实现了Serializable接口
8.Enum向所有的Java类一样,提供了toString方法。你可以改写这个方法。如果改写了该方法,记得要提供一个fromString方法用来将特定的字符串翻译成enum常量。
9.提供了valueOf(String)
方法,不过经常不顶用。可以像8描述的提供自己的static
方法fromString。
10.因为有了Enum类型,不存在名字冲突的问题,也就不需要名字前缀来区分不同的类型
11.Enum本质上是一个不可变类,所以你可以增加很多方法或者成员变量,但是所有成员变量必须是final。
12.如果你的enum是一个通用的类型,可以成为top-level类。如果该enum和某个类关联紧密,可以成为这个类的成员类。
13.提供了静态方法values,可以返回一个数组,数组的元素都是枚举常量,按照声明的顺序排列。
14.Constant-specific
method,可以针对每个enum常量定制同一个方法的不同实现,避免了switch/case语句。
//
Enum type with constant-specific method implementations
public
enum Operation {
PLUS
{ double apply(double x, double y){return x + y;} },
MINUS
{ double apply(double x, double y){return x - y;} },
TIMES
{ double apply(double x, double y){return x * y;} },
DIVIDE
{ double apply(double x, double y){return x / y;} };
abstract
double apply(double x, double y);//没有实现体的抽象方法,各个常量自己实现。
}
取代了旧式的:
//
Enum type that switches on its own value - questionable
public
enum Operation {
PLUS,
MINUS, TIMES, DIVIDE;
//
Do the arithmetic op represented by this constant
double
apply(double x, double y) {
switch(this)
{
case
PLUS: return x + y;
case
MINUS: return x - y;
case
TIMES: return x * y;
case
DIVIDE: return x / y;
}
throw
new AssertionError("Unknown op: " + this);
}
}
15.总是应该显式的指定常量值,而不是依赖顺序。当使用int作为常量类型的时候特别要注意。这样易于维护。
分享到:
相关推荐
本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java中是一个类,可以通过`enum`关键字来声明。例如,我们可以创建一个表示星期的枚举类型: ```java public enum WeekDay { MONDAY, ...
### Java中的Enum使用与分析 #### 一、概述 在Java编程语言中,`Enum`是一种特殊的数据类型,用于表示一组固定的常量值。通过枚举(`enum`),开发者可以更加直观地定义一系列预定义的值,并为这些值提供类型安全...
4. **使用私有构造函数**:虽然`Enum`禁止公开构造函数,但可以定义私有构造函数并在枚举体内部使用,以便为枚举值提供额外的信息或状态,如描述信息: ```java public enum Color { Red("This is Red"), Green...
枚举(Enum)在Java中是一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的常量表示方式。以下是对Enum的详细讲解: 1. **基本枚举定义**: ```java enum Color {BLUE, RED, GREEN;} ``` 这是...
cpp-BetterEnums是一个优秀的C++库,它提供了编译时期的枚举增强功能,旨在改善标准C++枚举的使用体验。该库由Aantron开发,其主要特点在于简洁的语法、轻量级的实现以及无任何外部依赖性,这使得它在实际项目中易于...
这个教程将深入讲解protobuf中的枚举(Enum)和包(Package)的使用,帮助你更好地理解和应用protobuf。 一、protobuf枚举(Enum) 枚举在编程中是一种常量集合,它提供了类型安全和可读性。在protobuf中,枚举...
目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...
在编程中,`enum`(枚举)类型是用来定义一组命名的整数常量,它在C++中被广泛使用。然而,在某些情况下,我们可能会遇到`enum`类型的重定义问题,这通常发生在包含不同库或者头文件时,因为这些库可能已经定义了...
### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...
ENUM标准是IETF制定的协议,旨在将E.164电话号码映射为DNS域名,从而使得电话号码能够在互联网上作为地址资源使用,整合了传统电信业务和互联网业务。 1. SIP协议与SIP系统组成 SIP(Session Initiation Protocol)...
下面我们将深入探讨enum的使用方法。 1. **定义枚举** 定义枚举的关键字是`enum`,例如: ```java public enum WeekDays { MON, TUE, WED, THU, FRI, SAT, SUN; } ``` 这里我们创建了一个名为`WeekDays`的...
本教程将深入探讨如何在Laravel项目中使用enum类,以及它能为代码质量、可读性和可维护性带来的好处。 1. **什么是PHP枚举(Enums)?** PHP枚举是类型安全的数据结构,允许我们定义一组相关的常量,它们的值在运行时...
在这个“enum 结构分析源码”资源中,我们主要关注的是C语言中的枚举使用和实现。C语言中的enum并不是一种真正的类型,而是对整型变量的一种别名,它提供了更易读的常量名称。 首先,我们来看`enum.c`这个源文件。...
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
本文将深入探讨`enum`的简单使用方法以及如何结合委托(delegate)进行应用。 首先,我们来看如何声明一个枚举。在C#中,你可以使用`enum`关键字来创建一个新的枚举类型。下面是一个简单的例子: ```csharp public...
### C++中的枚举类型(Enum) 在C++编程语言中,枚举(`enum`)是一种用户定义的类型,它由一组具有整数值的命名常量组成。这些值可以被程序用来代替数字,使代码更具可读性,并且能够表示特定范围内的固定集合。 ...
在上面的示例中,我们使用 enum 来定义一个 `Signal` 枚举类型,并在 `TrafficLight` 类中使用 switch 语句来处理不同的信号状态。 用法三:添加新方法 如果我们想要在 enum 中添加新的方法,那么必须在 enum 实例...
Laravel Enum库是为Laravel应用程序设计的一个扩展,它允许开发者使用枚举类型来替代传统的常量或字符串,从而使得业务逻辑更清晰,减少错误的可能性。下面将详细探讨Laravel Enum的使用、优点以及如何在项目中实现...
使用 ENUM 可以把某个数据列的基数很低的值转换为 ENUM 列,ENUM 值可以被更快地处理,因为它们在内部表现为数值。 四、优化 GROUP BY 语句 默认情况下,MySQL 排序所有 GROUP BY 包含的字段,为了防止排序结果的...