在下面的代码块中有必要使用vo吗Enum.valueOf么

enum 的全称为 enumeration, 是 JDK 1.5
中引入的新特性,存放在 java.lang 包中。
下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:
1. 原始的接口定义常量
2. 语法(定义)
3. 遍历、switch 等常用操作
4. enum 对象的常用方法介绍
5. 给 enum 自定义属性和方法
6. EnumSet,EnumMap 的应用
7. enum 的原理分析
原始的接口定义常量
public interface IConstants {
String MON = "Mon";
String TUE = "Tue";
String WED = "Wed";
String THU = "Thu";
String FRI = "Fri";
String SAT = "Sat";
String SUN = "Sun";
语法(定义) 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式
Class Enum&E extends Enum&E&&,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到
protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package com.hmw.
* 枚举测试类
* @author &a href="mailto:"&何明旺&/a&
public enum EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum&EnumTest&("MON",0);
new Enum&EnumTest&("TUE",1);
new Enum&EnumTest&("WED",2);
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
System.out.println("----------------我是分隔线------------------");
EnumTest test = EnumTest.TUE;
switch (test) {
System.out.println("今天是星期一");
System.out.println("今天是星期二");
// ... ...
System.out.println(test);
输出结果:
enum 对象的常用方法介绍
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class&E& getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static &T extends Enum&T&& T valueOf(Class&T& enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
&span style="font-size:14"&
&/span&public class Test {
public static void main(String[] args) {
EnumTest test = EnumTest.TUE;
//compareTo(E o)
switch (test.compareTo(EnumTest.MON)) {
System.out.println("TUE 在 MON 之前");
System.out.println("TUE 在 MON 之后");
System.out.println("TUE 与 MON 在同一位置");
//getDeclaringClass()
System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
//name() 和
toString()
System.out.println("name(): " + test.name());
System.out.println("toString(): " + test.toString());
//ordinal(), 返回值是从 0 开始
System.out.println("ordinal(): " + test.ordinal());
输出结果:
TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1 &span style="font-size:14"&
给 enum 自定义属性和方法给 enum 对象加一下 value 的属性和 getValue() 的方法:
&span style="font-size:14"&
&/span&package com.hmw.
* 枚举测试类
* @author &a href="mailto:"&何明旺&/a&
public enum EnumTest {
MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
public boolean isRest() {
public boolean isRest() {
private EnumTest(int value) {
this.value =
public int getValue() {
public boolean isRest() {
public class Test {
public static void main(String[] args) {
System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
输出结果:
EnumTest.FRI 的 value = 5 &span style="font-size:14"&
&/span&EnumSet,EnumMap 的应用public class Test {
public static void main(String[] args) {
// EnumSet的使用
EnumSet&EnumTest& weekSet = EnumSet.allOf(EnumTest.class);
for (EnumTest day : weekSet) {
System.out.println(day);
// EnumMap的使用
EnumMap&EnumTest, String& weekMap = new EnumMap(EnumTest.class);
weekMap.put(EnumTest.MON, "星期一");
weekMap.put(EnumTest.TUE, "星期二");
// ... ...
for (Iterator&Entry&EnumTest, String&& iter = weekMap.entrySet().iterator(); iter.hasNext();) {
Entry&EnumTest, String& entry = iter.next();
System.out.println(entry.getKey().name() + ":" + entry.getValue());
}原理分析enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum&E&。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:
public class com.hmw.test.EnumTest extends java.lang.Enum{
public static final com.hmw.test.EnumTest MON;
public static final com.hmw.test.EnumTest TUE;
public static final com.hmw.test.EnumTest WED;
public static final com.hmw.test.EnumTest THU;
public static final com.hmw.test.EnumTest FRI;
public static final com.hmw.test.EnumTest SAT;
public static final com.hmw.test.EnumTest SUN;
static {};
public int getValue();
public boolean isRest();
public static com.hmw.test.EnumTest[] values();
public static com.hmw.test.EnumTest valueOf(java.lang.String);
com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
深入理解Java枚举类型(enum)
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
http://blog.csdn.net/javazejian/article/details/
Java中创建枚举并赋初值
枚举在内部其实都是数值,如果只申明枚举而不赋值,是不安全的.
public enum TableType {
TABLE, VIEW;}
就像上面这样,创建后,并且保存到数据库里.如果后期再添...
java enum实现的单例
为了防止通过反序列化得到多个对象,EJ提倡使用enum实现单例:
关于枚举的对象为什么可以反序列化:可以看Enum类的如下方法:
* prevent de...
java学习笔记之
--------枚举(enum)
enum枚举类型是JAVA SE 5.0 以后的版本新定义出来的, 在此版本之前,有个常用的方法来做枚举类,
这个是视频中学到的。。。
public stat...
enum的用法详解
Java Enum原理
public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE };
实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此...
JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。大师兄我又加上自己的理解,来帮助各位理解一下。用法一:常量在JDK1.5 之前,我们定义常量都是...
应用场景枚举通常用来列举一个类型的有限实例集合,我们可以使用常量集来实现,jdk1.5添加了枚举(enum)支持,解决了常量集的一些缺陷
- 常量集中的变量不会必然在指定的范围内
- 常量能够提供...
在一些情况下,一个类的对象是有限且固定的,如季节类,只有春夏秋冬4个对象,这种实例有限且固定的类,在JAVA里称为枚举类。
1.手动实现枚举类
采用的设计方式:
通过private将构造器...
* 随机取得enum中的一个enum实例工具类
* 枚举和泛型的使用
* @author zghw
public class Enums {
private static...
String com.comtop.lcam.common.util.EnumUtils.getValue(IEnum[] ie, String key)
EnumUtils.getValue(...
没有更多推荐了,一、分析 每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode、name、valueOf等,其中valueOf方法会把一个String类型的名称转变成枚举项,也就是在枚举项中查找字面值和该参数相等的枚举项。 我们来深入分析一下该valueOf方法的源代码: public static &T extends Enum&T&& T valueof(Class&T& enumType,String name){
//通过反射,从常量列表中查找
T result = enmuType.enumConstantDirector().get(name);
if(result != null)
if(name == null)
throw new NullPointerException("Name is null");
//最后排除无效参数异常
throw new IllegalArgumentException("No enum const" + enumType + "." + name);
} valudOf方法通过反射从枚举类的常量声明中查找,若找到就直接返回,若找不到则抛出无效参数异常。valueOf的本意是保护编码的枚举安全性,使其不产生空枚举对象,简化枚举操作,但是却又引入了一个我们无法避免的IllegalArgumentException异常。 二、场景 我们来看如下代码: public static void main(String[] args){
//注意summer是小写
List&String& params = Arrays.asList("Spring","summer");
for(String name:params){
//查找字面值与name相同的枚举项
Season s = Season.valueOf(name);
if(s != null){
//有枚举项时
System.out.println(s);
//没有枚举项
System.out.println("没有相关枚举项");
} summer无法转换Season枚举,根据上面的分析,就会抛出IllegalArgumentException异常,一旦抛出异常,后续的代码就不运行了!!! 这与我们的习惯很不一致,例如我们从一个List中查找一个元素,即使不存在也不会报错,顶多返回indexOf方法返回-1。 三、建议 1.使用try-catch捕捉异常 try{
Season s = Season.valueOf(name);
//有该枚举项时处理
System.out.println("s");
}catch(Exception e){
System.out.println("无相关枚举项");
} 2.扩展枚举类 由于Enum类定义的方法都是final类型的,所以不希望被覆写,我们可以通过增加一个contains方法来判断是否包含指定的枚举项,然后在继续转换,代码如下: enum Season{
Spring,Summer,Autumn,W
//是否包含枚举项
public static boolean contains(String name){
//所有的枚举值
Season[] season = values();
//遍历查找
for(Season s : season){
if(s.name().equals(name)){
} 新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息!(甭客气!尽情的扫描或者长按!)
java枚举类Enum方法简介(valueof,value,ordinal)
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,
它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。
当我们在声明一个enum类型时,我们应该注意到en...
深入理解Java枚举类型(enum)
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
http://blog.csdn.net/javazejian/article/details/
在编写Java程序时经常会用到枚举(后面统一用enum描述)类型,今天我们就来看一下enum中常用到的values()方法。
首先,我们在Eclipse中编写一个简单的类:
public clas...
enum 的全称为 enumeration, 是 JDK 1.5
中引入的新特性,存放在 java.lang 包中。下面是我在使用 enum 过程中的一些经验和总结。原始的接口定义常量public ...
问题引入:如何限制用户输入class Student{
// 考试等级
private S //等级只能是AB...
Java高级特性之枚举(二)
01.Enum不可以有public或者protected的构造方法,只能是private或friendly(就前面不用修饰符),这样可以保证客户代码不能新建一个Enum的实例,我们也不需要实例化Enu...
使用反射读取enum的属性
使用到的Enum如下:
public enum Colour{
RED(113001, &红色&),
BLUE(113002, &蓝色&);
private i...
没有更多推荐了,浅谈Java枚举的作用与好处
转载 &更新时间:日 11:21:41 & 作者:杭州丁俊的博客
下面小编就为大家带来一篇浅谈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 {
private static int number = Color.values().
public static Color getRandomColor(){
long random = System.currentTimeMillis() %
switch ((int) random){
return Color.R
return Color.G
return Color.B
default : return Color.R
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
public String toString(){
switch (this){
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
return "Unknow Color";
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Green
Color.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");
Color(String desc){
this.desc =
public String getDesc(){
return this.
这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color {
public String toString(){
return "Color.Red";
public String toString(){
return "Color.Green";
public String toString(){
return "Color.Blue";
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
以上这篇浅谈Jave枚举的作用与好处就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具java.lang.Enum.valueOf()&方法返回指定名称enumtype的枚举常量。该名称必须用于声明在此类型的枚举常量的标识符完全匹配。
以下是java.lang.Enum.valueOf()方法的声明
public static &T extends Enum&T&& T valueOf(Class&T& enumType, String name)
enumType&-- 这是枚举类型,返回一个常量的类的对象。
name&-- 这是常量,要返回的名称。
此方法返回具有指定名称的枚举类型的枚举常量。
IllegalArgumentException&-- 如果指定的枚举类型没有常量指定名称,或指定的类对象不表示枚举类型。
NullPointerException&-- 如果&enumType 或&name 为&null.
下面的例子显示java.lang.Enum.valueOf()方法的使用。
package com.yiibai;
import java.lang.*;
// enum showing Mobile prices
enum Mobile {
Samsung(400), Nokia(250),Motorola(325);
int price;
Mobile(int p) {
price = p;
int showPrice() {
return price;
public class EnumDemo {
public static void main(String args[]) {
System.out.println(&CellPhone List:&);
for(Mobile m : Mobile.values()) {
System.out.println(m + & costs & + m.showPrice() + & dollars&);
Mobile ret;
ret = Mobile.valueOf(&Samsung&);
System.out.println(&Selected : & + ret);
让我们来编译和运行上面的程序,这将产生以下结果:
CellPhone List:
Samsung costs 400 dollars
Nokia costs 250 dollars
Motorola costs 325 dollars
Selected : Samsung
易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。
上一篇:下一篇:
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加3个群。
Java技术群:
(人数:2000,等级:LV5,免费:否)
MySQL/SQL群:
(人数:2000,等级:LV5,免费:否)
大数据开发群:
(人数:2000,等级:LV5,免费:否)
Python技术群:
(人数:2000,等级:LV5,免费:否)
人工智能深度学习:
(人数:2000,等级:LV5,免费:否)
测试工程师(新群):
(人数:1000,等级:LV1,免费:是)
前端技术群(新群):
(人数:1000,等级:LV1,免费:是)
C/C++技术(新群):
(人数:1000,等级:LV1,免费:是)
Node.js技术(新群):
(人数:1000,等级:LV1,免费:是)
PostgreSQL数据库(新群):
(人数:1000,等级:LV1,免费:否)
Linux技术:
(人数:2000,等级:LV5,免费:否)
PHP开发者:
(人数:2000,等级:LV5,免费:是)
Oracle数据库:
(人数:2000,等级:LV5,免费:是)
C#/ASP.Net开发者:
(人数:2000,等级:LV5,免费:是)
数据分析师:
(人数:1000,等级:LV1,免费:是)R语言,Matlab语言等技术关于java枚举enum的问题,请指教?_百度知道
关于java枚举enum的问题,请指教?
enum有这个问题:枚举的本意是设置若干个限定的对象,那为什么枚举还有这个方法,valueOf(Class&T&enumType,Stringname),这样的结果不就增加了对象吗?感觉矛盾,如果不是,那么这个...
enum有这个问题:枚举的本意是设置若干个限定的对象,那为什么枚举还有这个方法,valueOf(Class&T& enumType, String name),这样的结果不就增加了对象吗?感觉矛盾,如果不是,那么这个方法到底有什么用呢?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:13
获赞数:53
不会增加对象的,如果name不是在限定的对象内会报错的。举例说明其作用:如果有 public enum Zimu{A,B, C}
调用Zimu a = Zimu.valueOf(Zimu.class, &A&)会返回枚举类型的A。建议看下API。希望能解决你的疑惑!
enum Test{
A,B,C; } Test a=Test.valueOf(Test.class,&G&);我这样写没有报错呀,“不会增加对象的,如果name不是在限定的对象内会报错的。”这句话不对吧。。。。。
在运行的时候会报错的,不行你运行一下。代码:public class EnumTest {
enum Test{
public static void main(String[] args) {
Test a=Test.valueOf(Test.class,&G&); }}运行结果:Exception in thread &main& java.lang.IllegalArgumentException: No enum const class file.EnumTest$Test.G at java.lang.Enum.valueOf(Enum.java:196) at file.EnumTest.main(EnumTest.java:8)
采纳数:182
获赞数:601
注意看valueOf的返回值,这里返回的是一个enum对象,也就是生成这个对象,并不是增加对象,相当于用指定的类型及名称生成一个枚举类型对象,有点像构造函数(虽然还是很多不同,但类似)
擅长:暂未定制
根据name,返回对应的枚举类型对象
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 有必要使用净水器吗 的文章

 

随机推荐