二十五、JDK1.5新特性---枚举
与上篇文章介绍的相同,本文也是介绍jdk 1.5出现的新特性,本文将介绍枚举的相关用法。
在jdk 1.5 之前。Java可以有两种方式定义新类型:类和接口。对于大部分面向对象来说。这两种方法看起来似乎足够了。但是在一些特殊情况下,这些方法就不合适。例如:想定义一个Color类,它只能由Red、Green、Blue三种值,其他的任何形式都是非法的。那么jdk 1.5之前虽然可以构造出这样的发image,但是要做很多的工作,也就可能带来各种不安全的问题。而在 jdk 1.5之后引入的枚举类型(Enum)就能避免这些问题。
所谓的枚举就是规定好了指定的取值范围,所以都得内容只能从指定的范围中取得。使用简单类完成颜色的固定取值问题。也就是说一个类只能产生固定的几个对象。例如:
package enum_;
class Color{
public static final Color RED=new Color("红色");// 定义第一个对象
public static final Color GREEN=new Color("绿色");// 定义第一个对象
public static final Color BLUE=new Color("蓝色");// 定义第一个对象
private String name;
Color(String name){
this.name=name;
}
public static Color getInstance(int i){
switch(i){
case 1:return RED;
case 2:return GREEN;
case 3:return BLUE;
default:return null;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ColorDemo1 {
public static void main(String[] args) {
Color c1=Color.RED;//取得红色
System.out.println(c1.getName());
Color c2=Color.getInstance(3);
System.out.println(c2.getName());
}
}
此时程序限定了所能取的对象的范围,所以达到了枚举的功能,以上是一种枚举的方式,在早期的java开发中没有没有枚举这个概念,所以有时候也可以使用接口表示。
interface Color{
public static final int RED = 1 ; // 定义红色
public static final int GREEN = 2 ; // 定义绿色
public static final int BLUE = 3 ; // 定义蓝色
}
因为以上的所有取值都是直接使用数字表示的,所以操作的时候会存在一些问题。比如:
public class ColorDemo02{
public static void main(String args[]){
System.out.println(Color.RED + Color.GREEN) ; // 颜色相加
}
}
这个操作并不是很明确,所以在jdk 1.5之前如果要实现枚举操作就会比较麻烦。
Enum
从上文的描述可以清晰的了解到,使用enum关键字可以定义一个枚举,实际上这个关键字是java.lang.Enum类型,即使用enum声明的枚举类型相当于定义了一个类,只是这个类默认继承java.lang.Enum类
枚举类的主要操作方法
protected |
||
int |
比较此枚举与指定对象的顺序。 |
|
boolean |
当指定对象等于此枚举常量时,返回 true。 |
|
protected void |
finalize() |
|
getDeclaringClass() |
||
int |
hashCode() |
|
name() |
||
int |
ordinal() |
|
toString() |
||
static
|
valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。 |
构造方法介绍
构造方法中接收两个参数,一个表示枚举的名字,另一个表示枚举的序号(从0开始)
protected Enum(String name, int ordinal)
构造枚举的第一种方式
enum Color{
RED,GREEN,BLUE;
}
上面的方法是一种简单的形式,在我们开发中遇到的情况往往比较复杂,比如使用一些文字表述定义枚举对象的信息,这时就需要使用第二种方式了。
enum Color{
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private String name;
private Color(String name){
this.name=name;
}
}
如果不想通过构造实现设置内容,二十希望通过setter()方法实现,这时就必须按照以下的方式执行
enum Color {
RED, GREEN, BLUE;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
switch (this) {
case RED:
if ("红色".equals(name))
this.name = name;//允许设置名字
else
System.out.println("设置内容错误");
break;
case GREEN:
if ("蓝色".equals(name))
this.name = name;//允许设置名字
else
System.out.println("设置内容错误");
break;
case BLUE:
if ("绿色".equals(name))
this.name = name;//允许设置名字
else
System.out.println("设置内容错误");
break;
}
}
}
集合框架对Enum的支持
EnumMap
类 EnumMap<K extends Enum<K>,V>
java.util.EnumMap<K,V>
所有已实现的接口:
Serializable, Cloneable, Map<K,V>
案例示范
enum Color {
RED, GREEN, BLUE;
}
public class EnumMapDemo {
public static void main(String[] args) {
Map<Color ,String >desc=null;//定义Map对象,同时指定类型
desc=new EnumMap<Color,String>(Color.class);//实例化EnumMap
desc.put(Color.RED,"红色");
desc.put(Color.GREEN,"率色");
desc.put(Color.BLUE,"蓝色");
System.out.println("====输出所有内容====");
for(Color c:Color.values()){
System.out.println(c.name()+":"+desc.get(c));
}
System.out.println("====输出所有键====");
for(Color c:desc.keySet()){
System.out.print(c.name()+"、");
}
System.out.println("====输出所有值====");
for(String s:desc.values()){
System.out.print(s+"、");
}
}
}
EnumSet
EnumSet是Set接口的子类,所以里面的元素是无法重复的,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类中提供了很多的静态方法。
案例示范:
enum Color {
RED, GREEN, BLUE;
}
public class EnumSetDemo {
public static void main(String[] args) {
demo1();
demo2();
demo3();
demo4();
demo5();
}
// 将枚举中的所有元素放到EnumSet中
private static void demo1() {
EnumSet<Color> es = null;// 声明一个EnumSet集合
System.out.println("===EnumSet.allOf(Color.class)===");
es = EnumSet.allOf(Color.class);// 将枚举中的所有元素放到EnumSet中
print(es);
}
// 只设置一个元素到集合中
private static void demo2() {
EnumSet<Color> es = null;// 声明一个EnumSet集合
System.out.println("===EnumSet.Of(Color.BLUE)===");
es = EnumSet.of(Color.BLUE);// 为集合添加指定的一个元素
print(es);// 打印该集合
}
// 创建只能存放指定枚举类型的集合
private static void demo3() {
EnumSet<Color> es = null;// 声明一个EnumSet集合
System.out.println("===EnumSet.noneOf(Color.class)===");
es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合
es.add(Color.BLUE);// 添加元素
// es.add("我的颜色");编译不通过
print(es);
}
// 创建不包含指定元素的集合
private static void demo4() {
EnumSet<Color> es = null;// 声明一个EnumSet集合
System.out.println("===EnumSet.complementOf(Color.BLUE)===");
es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合
es.add(Color.BLUE);// 添加元素
es.add(Color.RED);// 添加元素
EnumSet<Color> esNew = null;
esNew = EnumSet.complementOf(es);// 新的集合不包含上面指定元素
print(esNew);
}
// 拷贝一个集合
private static void demo5() {
EnumSet<Color> es = null;// 声明一个EnumSet集合
System.out.println("===EnumSet.copyOf(Color.BLUE)===");
es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合
es.add(Color.BLUE);// 添加元素
es.add(Color.RED);// 添加元素
EnumSet<Color> esNew = null;
esNew = EnumSet.copyOf(es);// 将一个集合拷贝给另一个集合
print(esNew);// 打印该集合
}
private static void print(EnumSet<Color> es) {// 专门用来输出的操作
for (Color c : es) {// 循环输出EnumSet中的内容
System.out.print(c + "、");
}
System.out.println();
}
}
二十五、JDK1.5新特性---枚举的更多相关文章
- 二十七、JDK1.5新特性---Annotation
上篇文章介绍了反射的一些基础知识以及应用案例,本文将介绍jdk 1.5 出现的新特性——Annotation也就是我们所说的注解,即使用注释的方式加入一些程序的信息. 注解相当于一种标记,在程序中加了 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- JDK1.8新特性之(二)--方法引用
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
- C#学习基础概念二十五问
C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
随机推荐
- [转]Oracle数据块体系的详细介绍
数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...
- c# winform编程之多线程ui界面资源修改总结篇
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- CSS3过渡、变形和动画
1.CSS3过渡 所谓CSS3过渡,就是使用CSS3让元素从一种状态慢慢转换到另一种状态.如鼠标的悬停状态就是一种过渡.如下例子: #content a{ text-decoration: n ...
- Android Unable to instantiate activity: Didn't find class on path
Android Unable to instantiate activity: Didn't find class on path After i spend a while on this prob ...
- centos 6.5安装node.js
1.检查是否安装gcc编译器 rpm -q gcc rpm -q gcc-c++ 2.如果没有安装则通过以下代码安装gcc编译器 yum -y install gcc-c++ kernel-devel ...
- Java线程:线程的同步-同步方法
Java线程:线程的同步-同步方法 线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问 ...
- extjs 4.2 高度自适应
问题描述: gridPanel放在tabpanel页中,而且这个tabpanel页是通过add方法添加的,页面整体布局是:首先一个viewPort布局,left区域是一个treePanel,通过点击t ...
- (copy) Top Ten Reasons not to use the C shell
http://www.grymoire.com/Unix/CshTop10.txt ========================================================== ...
- JMeter学习(三十四)测试报告优化
如果按JMeter默认设置,生成报告如下: 从上图可以看出,结果信息比较简单,对于运行成功的case,还可以将就用着.但对于跑失败的case,就只有一行assert错误信息.(信息量太少了,比较难找到 ...
- 使用命令行 Subversion 访问项目源文件(SVN)
from:http://www.open.collab.net/scdocs/ddUsingSVN_command-line.html.zh-cn 命令行 Subversion 入门 如果您参与的项目 ...