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的一些高级特性,否则就和简单易懂的初衷想违背了。
- 浏览: 1223134 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (883)
- Spring (101)
- Swing (1)
- Mysql (21)
- Js (59)
- Jsp (2)
- Hibernate (19)
- Myeclipse (5)
- SqlServer 2000 (2)
- poi (15)
- Java (70)
- SSH (12)
- Html (47)
- Fusion Charts (1)
- C\C++ (2)
- 汇编 (36)
- Jquery (37)
- Struts2 (6)
- Ubuntu (16)
- powerDesinger (4)
- Jboss (3)
- JAX-RS (13)
- JAXB (5)
- JAX-WS (11)
- JMS (4)
- WebSocket (8)
- PHP (16)
- Flash (1)
- maven (3)
- Oracle (8)
- HttpClient (6)
- sqlserver (19)
- svn (5)
- Tomcat (3)
- Jdbc (3)
- EsayUi (11)
- 微信公众平台 (19)
- IIS (2)
- Freemarker (11)
- Comet (1)
- Spring MVC (85)
- JBoss Seam (3)
- 二维码 (9)
- Spring Security (4)
- Ehcache (3)
- Apache Shiro (7)
- jackson (16)
- JPA (8)
- jcaptcha (2)
- RSA (2)
- Ajax (6)
- 跟我学Shiro (0)
- Spring4 (19)
- 跟我学spring3 (0)
- css (32)
- excel (4)
- Filter (3)
- 微信公众帐号开发教程 (0)
- Android (6)
- log4j (6)
- 淘宝接口 (17)
- 支付集成 (3)
- 单点登录 (3)
- Html5 (27)
- 移动平台前端 (3)
- Linux (44)
- FusionCharts (27)
- Json Jackson Xml (5)
- 方培工作室-微信开发 (0)
- Apache与Tomcat与IIS整合 (10)
- Nginx (17)
- webService (2)
- apache (4)
- lucene (3)
- lodop (2)
- Shiro (3)
- zTree (2)
- ireport (12)
- Servlet3.0 (5)
- 前端美工 (19)
- AngularJS (1)
- C#开发微信门户及应用 (0)
- Shell (3)
- bat脚本 (16)
- Bootstrap (26)
- Less (10)
- photoshop (6)
- Redis (6)
- Mongodb (10)
- MyBatis (3)
- 数据结构 (0)
- 读写分离-主从复制 (0)
- JFinal (0)
- 百度地图api (3)
- hadoop-hbase-hive-spark (3)
- WebStorm (2)
- Quartz (5)
- ios (0)
- Mina (8)
- Android Studio (4)
- Ratchet教程 (0)
- 移动端重构系列 (1)
- cubic-bezier贝塞尔曲线CSS3动画工具 (1)
- nginx+tomcat+memcached集群 (0)
- 集群 (0)
- ZooKeeper (3)
- Dubbo (0)
- vpn (0)
- kafka (0)
- JVM垃圾回收机制 (0)
- 微信小程序 (0)
- Lua (0)
- Hystrix (0)
- Vue.js (0)
- mycat (0)
- Openresty (0)
- springBoot (0)
- 新分类 (0)
- guava (0)
- 大数据 (0)
- Sentinel (0)
最新评论
-
JackMacing:
中文怎么解决?
SpringMVC与iReport(JasperReports) 5.6整合开发实例 -
18335864773:
用pageoffice把.可以实现在线的文档操作.直接转pdf ...
转:使用jasperreport动态生成pdf,excel,html -
linhao0907:
推荐一款轻量开源的支付宝组件:https://github.c ...
关于Alipay支付宝接口(Java版) -
songronghu:
太好了,非常有用,谢谢分享~
Java ConcurrentModificationException 异常分析与解决方案 -
wzwahl36:
http://www.atool.org/json2javab ...
Java下利用Jackson进行JSON解析和序列化
发表评论
-
迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的最清楚的好文章(快快珍藏)
2019-07-04 14:11 0https://my.oschina.net/u/41 ... -
系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
2019-07-04 11:11 0https://my.oschina.net/zhan ... -
五分钟搞懂什么是红黑树
2019-06-01 13:39 0www.360doc.com/content/18/0 ... -
史上最清晰的红黑树讲解(上、下)
2019-05-30 13:43 0https://www.cnblogs.com/Car ... -
JVM调优总结
2019-02-27 17:15 0https://www.cnblogs.com/and ... -
JVM:查看java内存情况命令
2019-02-27 16:59 5421jmap (linux下特 ... -
彻底理解Java的Future模式
2019-01-05 19:35 0https://www.cnblogs.com/cz1 ... -
java怎么传递泛型参数
2018-12-04 11:25 0package test; import java.uti ... -
java的集合(List)取出某一属性的方法
2018-11-23 10:39 0https://blog.csdn.net/qq_40 ... -
java7 WatchService监听文件
2017-08-19 10:24 9590package com.ssh.config ... -
java 常用集合list与Set、Map区别及适用场景总结
2017-07-04 15:49 0转载请备 ... -
(亲测可用)Description Resource Path Location Type Java compiler level does not match
2017-06-13 10:54 0解决办法 在项目上右键Properties-》Pro ... -
易百教程
2017-06-07 14:00 0http://www.yiibai.com/lua/l ... -
Zookeeper中文网
2017-05-26 14:44 0http://zookeeper.majunwe ... -
使用四种框架分别实现百万websocket常连接的服务器
2017-05-25 09:37 0http://colobu.com/2015/05/2 ... -
大数据-鸟窝
2017-05-25 08:52 0http://colobu.com/categorie ... -
Kafka深度解析,众人推荐,精彩好文!
2017-05-24 23:47 0http://www.cnblogs.com/cop ... -
Codis 是一个分布式 Redis 解决方案
2017-05-24 17:58 0http://www.oschina.net/p/co ... -
springmvc之redis篇(spring-data-redis整合)(redis单个和主从配置)
2017-05-23 18:39 0http://www.cnblogs.com/tank ... -
spring+springMvc+mybatis+maven+redis(单个redis配置)
2017-05-23 18:20 0http://blog.csdn.net/mynote ...
相关推荐
在枚举内部,可以通过`Enum<E extends Enum<E>>`的泛型方法`getDeclaringClass()`获取枚举常量所属的枚举类,以及`name()`和`ordinal()`方法获取常量的名称和在枚举中的位置。 总结来说,Java枚举类型提供了一种...
valueOf(String arg0) 方法是枚举类中的一个静态方法,它通过传入的 arg0 字符串解析出一个该枚举类的实例,其中传入的字符串必须是元素列表的名称之一,否则将抛出 java.lang.IllegalArgumentException 异常。...
在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来处理一组固定的数据集合。枚举中的每个元素都是该枚举类型的对象...
Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方 enum Season { ...也是说,使用name()方法和valueOf(String)方法能够在枚举类型对象和字符串之间方便得转换。当然,假设valu
- **隐含字段和方法**:枚举类内部包含了`values()`和`valueOf()`等方法。 #### 五、总结 通过本文的讨论可以看出,尽管使用`static final`字段也能实现某些枚举类型的功能,但枚举类型提供的类型安全、扩展性和...
例如,对于`Color`枚举,我们可以使用`Color.values()`获取所有颜色的数组,`Color.valueOf("RED")`获取`RED`实例,`Color.RED.ordinal()`获取`RED`的顺序,即0。 枚举在Java中有很多应用场景,如定义权限级别、...
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中: * values() 返回枚举类中所有的值。 * ordinal() 方法可以找到每个枚举常量的索引,就像数组索引一样。 * valueOf() 方法返回指定字符串值的枚举...
此外,枚举类型不能被实例化,除非通过`values()`或`valueOf()`方法,这增加了代码的可控性。 在Java中,枚举还可以用于switch语句,提供了一种更安全的替代传统的if...else if...else结构。例如: ```java ...
枚举类型继承自`java.lang.Enum`,这意味着我们可以使用`Enum`类中定义的方法,如`name()`、`ordinal()`等。 #### 五、自定义枚举类 除了基本的定义方式外,还可以在枚举类型中定义方法和属性。例如: ```java ...
- **性能考虑**:虽然枚举类型提供了很多便利,但频繁使用`valueOf`和`values`方法可能会对性能产生一定影响。 - **枚举值的顺序**:枚举值的顺序是固定的,通常是按照定义的顺序排列,这种顺序可能会影响到某些逻辑...
- `valueOf()`静态方法:根据名称创建枚举实例,如`Week.valueOf("SUN")`。 6. **枚举构造函数**: - 枚举构造函数是私有的,不允许有公共构造函数。 - 枚举构造函数在声明枚举实例时被调用,可以传递参数,如`...
6. `<T extends Enum<T>> T valueOf(Class<T> enumType, String name)`:根据枚举类型和名称获取对应的枚举值。 枚举的应用场景: 1. 替代一组常量,例如定义颜色: ```java public enum Color { RED, GREEN, ...
在 Java 中,枚举类型可以使用 enum 关键字来定义。 在 Spring Boot 应用程序中,枚举类型经常被用于定义一些固定的值,例如订单状态、用户角色等。然而,在使用枚举类型时,需要注意一些坑,否则可能会出现一些...
- 所有的枚举类都隐式继承了`java.lang.Enum`类,因此可以使用`Enum`类提供的方法,如`ordinal()`和`compareTo()`。 - `ordinal()`返回枚举元素在枚举类中的索引,例如`Color.RED.ordinal()`返回0,`Color.BLUE....
return OrderStatus.valueOf(dbData); } } ``` 然后在实体类的字段上使用`@Convert`注解: ```java @Entity public class Order { @Convert(converter = OrderStatusConverter.class) private OrderStatus ...
方法支持:** 枚举类型自动继承`java.lang.Enum`类,提供了`toString()`、`ordinal()`、`compareTo()`等方法,以及前面提到的`values()`和`valueOf()`方法。 **4. 可扩展性:** 枚举类型可以定义自己的方法和属性...
可以使用`valueOf()`方法将字符串转换为对应的枚举类型,但需要注意,如果字符串与枚举元素不匹配,会抛出`IllegalArgumentException`。同时,枚举可以通过`.ordinal()`得到整数表示,通过`.name()`得到字符串表示。...
- `valueOf`:根据枚举名称字符串返回对应的枚举实例。 此外,枚举可以包含私有构造函数和方法,以便初始化枚举实例和实现特定的功能。例如: ```java public enum Gender { MALE("男"), FEMALE("女"); private...
Java中的枚举类型(Enum)是在JDK 1.5版本中引入的一种特殊的类类型,它的设计目的是为了更好地管理和使用一组固定的常量。枚举在Java中提供了比传统的final常量更安全、更灵活的机制。以下是关于Java枚举类型的一些...