文档章节

JAVA基础之枚举

zjg23
 zjg23
发布于 2016/04/24 17:05
字数 909
阅读 58
收藏 0

1、枚举的作用

如果程序运行时需要的数据只能是一定范围内的值,jdk5之前我们可以采用自定义类来解决,jdk5后就可以直接采用枚举来解决了。

例如要限定操作类型只能为增删改查四种,我们可以用自定义类的方式解决如下:

public class Operation 
{  
    private String operType;
    
    private Operation(String operType)
    { 
	this.operType = operType;
    }
    
    public static final Operation ADD = new Operation("add");
    public static final Operation DELETE = new Operation("delete");
    public static final Operation MODIFY= new Operation("modify");
    public static final Operation SELECT = new Operation("select");

    public String getOperType() 
    {
        return operType;
    }

}

jdk5后我们就可以通过枚举来更简洁的解决问题:

 

public enum OperationByEnum
{
    ADD("add"), DELETE("delete"), MODIFY("modify"), SELECT("select");
    public String getOperType()
    {
	return operType;
    }

    private String operType;

    private OperationByEnum(String operType)
    {
	this.operType = operType;
    }

}

 查看上述两个类的class文件可以看出两种方式可以认为是等价的,

 

D:\java\workspace\EnumDemo\bin>javap OperationByEnum.class
Compiled from "OperationByEnum.java"
public final class OperationByEnum extends java.lang.Enum<OperationByEnum> {
  public static final OperationByEnum ADD;
  public static final OperationByEnum DELETE;
  public static final OperationByEnum MODIFY;
  public static final OperationByEnum SELECT;
  static {};
  public java.lang.String getOperType();
  public static OperationByEnum[] values();
  public static OperationByEnum valueOf(java.lang.String);
}

D:\java\workspace\EnumDemo\bin>javap Operation.class
Compiled from "Operation.java"
public class Operation {
  public static final Operation ADD;
  public static final Operation DELETE;
  public static final Operation MODIFY;
  public static final Operation SELECT;
  static {};
  public java.lang.String getOperType();
}

也就是说现在我们定义一个enum类型后,编译器自动帮我们实现一个构造函数为private自定义类,再也不用我们自己去实现一个类似于图1中的自定义类了。

2、带抽象方法的枚举

 

public class EnumTest {

    public static void main(String[] args) 
    {
	print(OperationByEnum.ADD);
    }
    
    public static void print(OperationByEnum arg)
    {
	System.out.println(arg.getOperType());
    }
    
}

输出 add

每个枚举值的获取操作类型方法此时获取的是英文名称,如果我想添加一个方法来获取每个操作类型的中文名称,应该怎么处理呢?此时带抽象方法的枚举就要闪亮登场了

public enum OperationByEnum
{
    ADD("add")
    {

	@Override
	public String getChineseName()
	{
	    return "增";
	}
	
    }, 
    DELETE("delete")
    {

	@Override
	public String getChineseName()
	{
	    return "删";
	}
	
    }, 
    MODIFY("modify")
    {

	@Override
	public String getChineseName()
	{
	    return "改";
	}
	
    },
   SELECT("select")
   {

    @Override
    public String getChineseName()
    {
	return "查";
    }
	
   };
    

    private String operType;
    
    public String getOperType()
    {
	return operType;
    }

    private OperationByEnum(String operType)
    {
	this.operType = operType;
    }
    
    public abstract String getChineseName();

}

此时就可以通过getChineseName来获取每个枚举值的中文名称了。

3、枚举类的常用API

所有枚举类均继承自java.lang.Enum类,其中比较常用的方法为:

下面的例子可以帮助我们理解valueOf方法的作用

 

String str = "ADD";
	OperationByEnum ob = OperationByEnum.valueOf(str);	
	System.out.println(ob == OperationByEnum.ADD);//TRUE
	
	String str2="add";
	OperationByEnum ob1 = OperationByEnum.valueOf(str2);
//Exception in thread "main" java.lang.IllegalArgumentException: No enum constant OperationByEnum.add

另外所有枚举类都会有一个values()方法,用于返回枚举的所有值

OperationByEnum[] array = OperationByEnum.values();
	for(OperationByEnum ob:array)
	{
	    System.out.println(ob.getChineseName());
	}

注:

Where does the Enum.valueOf(String) method come from?

/**
* Returns an array containing the constants of this enum 
* type, in the order they're declared.  This method may be
* used to iterate over the constants as follows:
*
*    for(E c : E.values())
*        System.out.println(c);
*
* @return an array containing the constants of this enum 
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type.  (Extraneous whitespace 
* characters are not permitted.)
* 
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);

4、枚举的特性总结

枚举类是一种特殊的JAVA类,枚举类中每声明一个枚举值就代表枚举类的一个实例对象。

与JAVA普通类一样,声明枚举类时也可以声明类的属性、方法、构造函数,但构造函数必须为私有。

枚举类也可以实现接口,继承抽象类。可以作为switch语句的参数。

若枚举类只有一个枚举值,则可以当做单例设计模式使用。

 

© 著作权归作者所有

zjg23

zjg23

粉丝 18
博文 125
码字总数 42233
作品 0
济南
程序员
私信 提问
加载中

评论(3)

zjg23
zjg23 博主
构造方法不能使用public修饰,只能是default 或者private;
zjg23
zjg23 博主

引用来自“zjg23”的评论

枚举类不能继承抽象类,java是单继承的

枚举已经继承了Enum类了
zjg23
zjg23 博主
枚举类不能继承抽象类,java是单继承的
你所需要的java提升篇大总结

java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序的深入解析 java基础(五) Str...

sihailoveyan
2018/04/25
0
0
Java程序设计经典300例

《Java程序设计经典300例》共分为3篇。 第1篇 基础篇(第1~5章)本篇主要内容包括:Java语言基础、流程控制、数组、字符串和面向对象编程。通过本篇的学习,读者可以掌握Java开发环境的配置...

请叫我院长
2013/12/03
469
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0
Java高级部分笔记-------Java5.0的新特性

静态导入 1.1 JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属性和方法的调用。 1.2 语法:Import static 包名.类名.静态属性|静态方法|* ...

查封炉台
2014/04/21
617
0
Java中枚举的线程安全性及序列化问题

来源:微信公众号 ,原创: Hollis --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字...

Java填坑之路
2018/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
52分钟前
5
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
131
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部