1、枚举(Enums)

JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enum. 我们可以这样来定义一个枚举类型
public enum Color
{
       Red,
       White,
       Blue
 }
然后可以这样来使用Color myColor = Color.Red.

public class ColorTest
{
public static void main(String[] args)
{
Color myColor = Color.Red;
for(Color color : Color.values())
{
System.out.println(color);
}
}
}

枚举类型提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
for (Color c : Color.values()) System.out.println(c);

2、枚举类型可以作为方法参数

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

3、定义枚举类型时本质上就是在定义一个类别,只不过很多细节由编译器帮您完成了,所以某些程度上,enum关键字的作用就像是class或interface。

当您使用“enum”定义 枚举类型时,实质上您定义出來的类型继承自 java.lang.Enum 类型,而每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance)——换句话说,当定义了一个枚举类型后,在编译时刻就能确定该枚举类型有几个实例,分别是什么,在运行期间我们无法在使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确定下来了。他们都被预设为 final,所以您无法改变他们,他们也是 static 成员,所以您可以通过类型名称直接使用他们,当然最重要的,它们都是公开的(public)。

我们所定义的每个枚举类型都继承自java.lang.Enum类,枚举中的每个成员默认都是public static final的。

4、既然枚举继承自类Enum,他也有自己的成员变量、构造方法。

public enum Coin
{
penny("hello"),nickel("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());
}
}

这里每个枚举值都是一个Coin类型的实例,括号里面的是构造方法需要的参数,构造方法就是Coin(String value)

5、enum的valueOf方法,返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)。values()方法返回枚举常量的集合

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));
}
}
}
enum OpConstant
{
TURN_LEFT,TURN_RIGHT,SHOOT
}

如果运行java ShowEnum SHOOT,打印:射击 2  1  0

compareTo()方法比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。

6、枚举的ordinal()方法,返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

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,

7、EnumSet,枚举集合,of()方法与complementOf()方法

import java.util.EnumSet;
import java.util.Iterator;
enum FontConstant
{
Plain,Bold,Italic
}
public class EnumSetDemo
{
public static void main(String[] args)
{
EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Bold,FontConstant.Italic);
showEnumSet(enumSet);
showEnumSet(EnumSet.complementOf(enumSet));
}
public static void showEnumSet(EnumSet<FontConstant> enumSet)
{
for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();)
{
System.out.println(iter.next());
}
}
}

noneOf()方法,按照给定的枚举类型生成一个空的枚举集合。

blic class EnumSetDemo2
{
public static void main(String[] args)
{
EnumSet<FontConstant> enumSet = EnumSet.noneOf(FontConstant.class);
enumSet.add(FontConstant.Bold);
enumSet.add(FontConstant.Italic);
showEnumSet(enumSet);
}
public static void showEnumSet(EnumSet<FontConstant> enumSet)
{
for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();)
{
System.out.println(iter.next());
}
}
}

8、copyOf()方法

public class EnumSetDemo3
{
public static void main(String[] args)
{
List<FontConstant> list = new ArrayList<FontConstant>();
list.add(FontConstant.Italic);
list.add(FontConstant.Bold);
showEnumSet(EnumSet.copyOf(list));
}
public static void showEnumSet(EnumSet<FontConstant> enumSet)
{
for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();)
{
System.out.println(iter.next());
}
}
}

9、EnumMap枚举映射:

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_RIGHT, "向右");
map.put(Action.SHOOT, "射击");
map.put(Action.TURN_LEFT, "向左");
for(Action action : Action.values())
{
System.out.println(map.get(action));
}
}
}
enum Action
{
TURN_LEFT,TURN_RIGHT,SHOOT
}

打印的顺序是固定的,按照枚举Action中的枚举常量的顺序。

10、枚举的实际工程用处:在有限个选择项的环境中,如权限限制有系统管理员、管理员、vip用户、普通用户等,使用枚举

11、静态导入(Static import)   要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。

静态导入:import static 。。。。;导入要写到方法名和属性名

a) import static com.shengsiyuan.common.Common.Age;
b) import static com.shengsiyuan.common.Common.output;
 表示导入Common类中的静态成员变量AGE以及静态方法output。注意:使用import static时,要一直导入到类中的静态成员变量或静态方法

27、安全的枚举类型相关推荐

  1. Java魔法堂:枚举类型详解

    一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{RED = 0,BLUE = 1 } Console.Writ ...

  2. 枚举类型enum用法_Java枚举深度解读,看这篇就够了

    作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...

  3. 理解Java枚举类型

    (参考资料:深入理解java enum) 1.原理:对编译后的class文件javap反编译可以看出,定义的枚举类继承自java.lang.Enum抽象类且通过public static final定 ...

  4. 将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)

    回到目录 如果您看到这个题目,觉得有点怪,那说明你是一个高人,最起码比我高的多,呵呵. 前几天做了一个公用后台管理系统的项目,其中有一个地方涉及到权限管理的,即为每一个按钮赋一个权限,然后它权限汇总到 ...

  5. 【转】C#中枚举类型与静态变量

    C#中enum类型,相较于其他基本数据类型来说比较特殊,他的本质上是一堆整数组成的结构体,并且支持与整型的显式转化. 既然是枚举类型,那么也就是说enum中的变量是不可以轻易改变的,所以C#将枚举类型 ...

  6. define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

    Django 3.0的主要新增功能之一是对模型字段选择的枚举.它是一种定义和约束模型Field.choices的更好方法. 以前在Django模型中通常会通过定义一些"常量"和元组 ...

  7. MySQL精选 | 枚举类型ENUM的DDL变更测试

    导读 本文深入介绍枚举类型EUNM和集合类型SET.测试基于InnoDB存储引擎上,对MySQL数据库枚举类型ENUM的字段进行DDL变更操作,是否需要重新创建表呢?对数据库的事务处理有何影响?对数据 ...

  8. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  9. java 枚举类型_java 枚举类型(翻译自Java Tutorials)

    枚举类型,它是字段包含固定数量的常量的类型.常见的例子,罗盘的方向包括东西南北,还有星期的天. 因为他们是常量,所有枚举类型的字段的名字一般是大写字母. java编程语言,声明一个枚举类型使用enum ...

最新文章

  1. windows安装redis数据库
  2. js获取iframe中的元素_在 HTML 中包含资源的新思路
  3. 2018中国互联网企业100强揭晓!阿里巴巴名列榜首
  4. POJ 1723 Soldiers (中位数)
  5. 网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常
  6. ‘map’ does not name a type
  7. linux怎么在ETC文件夹内新建,教你如何手动新建Linux用户
  8. 没有业务思维,数据分析只能是一堆废纸
  9. mysql基础之mariadb集群双主(主主)架构
  10. 计算机软件专业代码表,2019-04-09 计算机软件适用的国民经济行业代码表
  11. 欺骗的艺术.资料搜集自互联网.
  12. regnam r语言_求助:R语言进行增加值分解的一部分代码看不懂,求大神过目
  13. matlab中换行操作
  14. 用户故事 | 李兆龙:博观而约取,厚积而薄发
  15. matlab 科研绘图
  16. LeetCode #1088. Confusing Number II
  17. mac上开启隐藏文件
  18. 可视对讲系统服务器连接失败,可视对讲系统呼叫分机、门口机不通是什么问题?...
  19. STM32F4_外部中断详解(EXTI)
  20. 腾讯、阿里、华为等各大互联网公司年终奖到底发了多少?

热门文章

  1. Python3 删除
  2. JAVA 17版本介绍(一)安装环境介绍
  3. 解决Unity3D使用VRTK时,VR眼镜连接不上的问题
  4. echarts快速上手
  5. Qt调整分辨率让文字变大或变小后变化解决方案
  6. envi查看影像中指定像素的经纬度
  7. Python零基础速成班-第13讲-Python正则表达式Regex
  8. 使用Mosquitto软件测试mqtt功能
  9. ubuntu下使用mosquitto与分析
  10. 大球吃小球html5,怎么用html5制作简单的大球吃小球的游戏