关于Java-枚举的总结
枚举
枚举的定义
枚举也是JDK5.0的新特性。
JDK5.0加入了一个全新类型的“类”——枚举类型。
为此引入了一个新的关键字enum。
可以这样来定义一个枚举类型:
public enum Color
{
Red, White, Blue,
}
然后可以这样来使用:
Color myColor = Color.Red;
枚举类型的静态方法
枚举类型提供了两个有用的静态方法values()和valueOf()。
values()返回枚举所有成员的数组。
values()方法的使用:
//values()方法的使用
for(Color color : Color.values())
{
System.out.println(color);
}
将输出:
Red
White
Blue
即values()输出定义在Color中的所有枚举类型。
而valueOf()将字符串转换成枚举值。
枚举的使用
枚举可以用在switch语句中。
例子:

public class EnumTest
{
public static void doOperation(OpConstant opConstant)
{
switch (opConstant)
{
case TURN_LEFT:
System.out.println("向左转");
break;
case TURN_RIGHT:
System.out.println("向右转");
break;
case SHOOT:
System.out.println("射击");
break;
default:
break;
} } public static void main(String[] args)
{
doOperation(OpConstant.SHOOT);
} } enum OpConstant
{
TURN_LEFT, TURN_RIGHT, SHOOT,
}

枚举的本质
先看一个例子:

public enum Coin
{
penny("hello"), nickle("world"), dime("welcome"), quarter("hello world"); private String value; public String getValue()
{
return value;
}
Coin(String value)
{
this.value = value;
} public static void main(String[] args)
{
Coin coin = Coin.quarter; System.out.println(coin.getValue());
} }

定义枚举类型时本质上就是在定义一个类别,只不过很多细节由编译器帮您完成,所以某种程度上,enum关键字的作用就像是class或interface。
当您使用“enum”定义枚举类型时,实质上您定义出来的类型继承自java.lang.Enum类型,而每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance),它们都被预设为final,所以您无法改变它们,它们也是static成员,所以您可以通过类型名称直接使用它们,当然最重要的,它们都是公开的(public)。即枚举中的每个成员默认都是public static final的。
枚举的本质:
每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance)。
当定义了一个枚举类型后,在编译的时候就能够确定该枚举类型有多少个实例,这些对象的名字是什么。在运行期间无法再使用该枚举类型创建新的实例。
枚举的比较
写下面一个程序:

public class ShowEnum
{
public static void main(String[] args)
{
enumCompareTo(OpConstant.valueOf(args[0]));
}
public static void enumCompareTo(OpConstant constant)
{
System.out.println(constant); //当前输入参数跟每一个枚举中的类型比较,并输出比较结果
for(OpConstant c : OpConstant.values())
{
System.out.println(constant.compareTo(c));
}
} }

然后在Run Configurations里面传入参数SHOOT,输出如下:
SHOOT
2
1
0
如果传入参数TURN_RIGHT:
TURN_RIGHT
1
0
-1
这个程序用于比较枚举成员谁在前谁在后,当输入SHOOT时,SHOOT和每个值比较时,它在TURN_LEFT后面两位,在TURN_RIGHT后面一位,和自己比较输出为0。
枚举显示
例子:

public class ShowEnum2
{ public static void main(String[] args)
{
for(OpConstant c: OpConstant.values())
{
System.out.printf("%d, %s, %n", c.ordinal(), c);
}
}
}

输出:
0, TURN_LEFT,
1, TURN_RIGHT,
2, SHOOT,
EnumSet
EnumSet的名称说明了其作用,它是在J2SE 5.0后加入的新类别,可以协助您建立枚举值的集合,它提供了一系列的静态方法,可以让您指定不同的集合建立方式。
EnumSet有多重重载的of()方法,用于构造含有指定枚举对象的枚举集合。
与之对应的有complementOf()方法,返回某个枚举集合的补集。
noneOf()方法构造一个指定枚举类型的空枚举集合。之后可以用add()方法加入元素。
copyOf()方法有两种重载形式,一种形式的参数为枚举集合EnumSet,另一种方式的参数为Collection。说明可以利用集合来构造枚举集合,注意如果Collection中有重复元素,只有一个会被加入枚举集合。
下面的代码例子中使用了这些方法:

import java.util.List;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Iterator; enum FontConstant
{
Plain, Bold, Italic, Hello,
} public class EnumSetDemo
{ public static void main(String[] args)
{
System.out.println("--------------of()-----------------");
// of()方法,构造含有指定元素的枚举集合
EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Plain,
FontConstant.Bold);
showEnumSet(enumSet); System.out.println("------------complementOf()---------------");
// complementOf()方法,构造指定枚举集合的补集
showEnumSet(EnumSet.complementOf(enumSet)); System.out.println("--------------noneOf()-----------------");
// noneOf()方法构造一个指定枚举类型的空枚举集合
EnumSet<FontConstant> enumSet2 = EnumSet.noneOf(FontConstant.class);
enumSet2.add(FontConstant.Italic);
showEnumSet(enumSet2); System.out.println("---------------copyOf()------------------");
// copyOf()方法的一种重载可以由集合构造枚举集合 // 先构造一个List
List<FontConstant> list = new ArrayList<FontConstant>();
list.add(FontConstant.Bold);
list.add(FontConstant.Italic);
list.add(FontConstant.Plain);
list.add(FontConstant.Bold); // 然后使用copyO方法构造一个EnumSet
showEnumSet(EnumSet.copyOf(list)); } public static void showEnumSet(EnumSet<FontConstant> enumSet)
{
for (Iterator<FontConstant> iter = enumSet.iterator(); iter.hasNext();)
{
System.out.println(iter.next());
}
} }

EnumMap
EnumMap的声明是:Class EnumMap<K extends Enum<K>,V>,表明其中的Key是枚举类型。
使用例子如下:

import java.util.EnumMap;
import java.util.Map; public class EnumMapDemo
{
public static void main(String[] args)
{
Map<Action, String> map = new EnumMap<Action, String>(Action.class); map.put(Action.TURN_LEFT, "向左转");
map.put(Action.SHOOT, "射击");
map.put(Action.TURN_RIGHT, "向右转"); for (Action action : Action.values())
{
System.out.println(map.get(action)); }
}
} enum Action
{
TURN_LEFT, TURN_RIGHT, SHOOT,
}
关于Java-枚举的总结的更多相关文章
- Java 枚举用法详解
概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 【转】Java 枚举7常见种用法
原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu 原创地址:http://blog.li ...
- 【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- Java枚举类使用
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- Java 枚举类型简介
目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...
- Java 枚举(enum) 详解7种常见的用法
Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...
- 使用javap进行反编译Java枚举
这是一个枚举类Day.java public enum Day { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY(" ...
随机推荐
- 服装类Web原型制作分享——Rodd & Gunn
Rodd & Gunn是国外知名的服装类品牌,服装种类繁多,有衣服.帽子.穿戴饰品等. 本原型由国产Mockplus(原型工具)和iDoc(智能标注,一键切图工具)提供. 网站原型以图文排版为 ...
- Linux入门练习操作命令
查看目录命令 1. 显示目录下所有文件 2.显示所有文件,包括隐藏文件 创建目录命令 1.在改目录下创建文件夹“practise” 切换目录 1.切换到指定的目录 2.切换到上一级目录 3.还在当前目 ...
- 【Game】2048小游戏
每个男孩都有一个游戏梦吧,本例简单讲述一款很火的游戏<2048>的制作. 本例参考地址:https://www.imooc.com/learn/76 游戏准备 1.游戏的逻辑(2048大家 ...
- 类似 QQ 音乐底部常驻播放栏(AVQueuePlayer)
一开始搞了个基类,但是这样所有类都要继承它才可以.后来考虑把他加到 window 上.但是在 appdelegate 中没有办法可以加到上面,最后在 keyWindow 的rootViewContro ...
- hibernate 的evict 和clear
摘自百度知道:http://zhidao.baidu.com/question/63663640.html 问: 先创建一个Student,然后调用session.save方法,然后再调用evict方 ...
- 开发简单的JavaWeb项目
一.配置相关环境 下载配置JDK,eclipse,Tomcat服务器,Mysql数据库,Navicat for MySQL(数据库可视化工具) 如果你已经做好各个环境的配置,eclipse与Tomca ...
- 用sql 生成2016年全年的日期
select to_char(日期,'yyyy-mm-dd') from( select to_date('2016-01-01','yyyy-mm-dd') + level 日期 from dual ...
- SQL语句关联查询
一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...
- vue 开发系列(四) vue 使用外部JS
概要 在开发时我们会经常需要使用到外部的JS,这样我们需要引入外部js,然后进行使用. 实现方法 我们在开发的过程中需要使用到 sha256 将用户的密码进行加密传输. 我们对js进行一点点改造. f ...
- 查询正在执行的SQL语句DBCCINPUTBUFFER
DBCC INPUTBUFFER 返回进程下SQL语句 如果查询所有的进程如何呢? 创建一个存储过程 CREATE proc pr_dbccINPUTBUFFER(@spid varchar(200) ...