Enum使用
来源:互联网 发布:微信网络兼职 编辑:程序博客网 时间:2024/05/22 01:56
<!--@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而不是intenumpattern或者stringenum pattern
int enum pattern
publicstatic final int APPLE_FUJI= 0;
publicstatic final int APPLE_PIPPIN= 1;
publicstatic final int APPLE_GRANNY_SMITH = 2;
publicstatic final int ORANGE_NAVEL = 0;
publicstatic final int ORANGE_TEMPLE = 1;
publicstatic final int ORANGE_BLOOD = 2;
缺点:
1.因为都是int类型,所以如果你在需要ORANGE_NAVEL的地方不小心传递了APPLE_FUJI,编译器不会报错。但是Enum类型是完全不一样的,编译器一定会报错。
2.同样,由于都是int类型,可以用operator==比较这两个逻辑上完全不相关的变量。编译器仍然不会报错。
3.更糟糕的是,我们可以当使用int变量一样的进行数学计算
//Tasty citrus flavored applesauce!
inti = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN;
4.我们必须用前缀来区分不同的ENUM类型,因为没有namespace。
5.编译时约束会导致未定义行为。使用int值发生了变化,客户程序必须重新编译,否则结果未定义。这条个人觉得倒不是多大问题。
6.没什么容易的方法获得表示枚举值的字符串表示。
String enumpattern
缺点:
1.由于依赖字符串比较,会导致性能问题。
2.用户很容易使用hard-code的字符串常量,而不采用你想要他们使用的stringenum pattern。编译的时候无法察觉,但是到了运行的时候,缺容易出错。字符串拼写错误是常见的错误。
enum type
请看下面两个最简单的枚举类型定义。
publicenum Apple { FUJI, PIPPIN, GRANNY_SMITH }
publicenum Orange { NAVEL, TEMPLE, BLOOD }
特性(优点):
1.构造函数是不可以被客户程序调用的,因此不能用来创建对象(实例)。构造函数是允许定义的,但是只能在Enum内部像下面这样使用:
publicenum Ensemble {
SOLO(1),DUET(2);
privatefinal int numberOfMusicians;
Ensemble(intsize) {
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-specificmethod,可以针对每个enum常量定制同一个方法的不同实现,避免了switch/case语句。
//Enum type with constant-specific method implementations
publicenum 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;} };
abstractdouble apply(double x, double y);//没有实现体的抽象方法,各个常量自己实现。
}
取代了旧式的:
//Enum type that switches on its own value - questionable
publicenum Operation {
PLUS,MINUS, TIMES, DIVIDE;
//Do the arithmetic op represented by this constant
doubleapply(double x, double y) {
switch(this){
casePLUS: return x + y;
caseMINUS: return x - y;
caseTIMES: return x * y;
caseDIVIDE: return x / y;
}
thrownew AssertionError("Unknown op: " + this);
}
}
15.总是应该显式的指定常量值,而不是依赖顺序。当使用int作为常量类型的时候特别要注意。这样易于维护。
- enum使用
- enum使用
- Enum使用
- enum使用
- Enum使用
- Enum使用方法,为什么使用typedef enum--转载
- C - enum和typedef enum的使用
- enum和enum class的使用
- C# 使用Enum
- hibernate使用enum类型。
- ibatis中使用Enum
- enum 使用描述
- Java Enum 使用
- enum、Static使用
- Enum使用demo
- 枚举类型-enum使用
- enum 使用 (初步)
- Enum使用实例
- Linux多线程
- SQL优化原则【转】
- jsp 生成验证码
- WCF 的日志配置
- 提高SQL查询性能的7个法宝【转】
- Enum使用
- SQL SERVER 获取表结构信息《转载》
- 给固定地址写入固定的数据
- sql server 2005数据库关于数据库本身结构的操作
- Sql server2005常用函数
- Sql server2005常用函数
- 缓慢变化维 基本三招
- hdu1059 Dividing
- oracle准备合并两大java虚拟机