文档章节

Java枚举类型Enum学习

z
 zhancy01
发布于 2016/07/10 23:57
字数 1244
阅读 19
收藏 0

项目中大量使用常量定义 public static fianl ....  去表示业务含义,也可以将相关的的常量到同一个枚举类型中。

枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类  

参照:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html

枚举学习,java.lang.Enum,java.util.EnumSet和java.util.EnumMap常用方法:

package org.rosa.learn.enumtype;

import java.util.EnumMap;
import java.util.EnumSet;

public enum Weeks {
	// 和下面构造方法对应
	MONDAY("星期一", 1), TUESDAY("星期二", 2), WEDNESDAY("星期三", 3), THURSDAY("星期四", 4), FRIDAY("星期五", 5),
	SATURADAY("星期六", 6), SUNDAY("星期日", 7);
	// 成员变量
	private String name;
	private int index;

	// 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化
	private Weeks(String name, int index) {
		this.name = name;
		this.index = index;
	}

	// 普通方法
	public static String getValue(int index) {
		for (Weeks c : Weeks.values()) {
			if (c.getIndex() == index) {
				return c.name;
			}
		}
		return null;
	}

	public static void main(String[] args) {
		// Returns the enum constant of the specified enum type with the specified name.
		Weeks weekEnum = Enum.valueOf(Weeks.class, "MONDAY");
		System.out.println("Enum实例化:" + weekEnum.toString()); // MONDAY
		testTraversalEnum();
		testEnumMap();
		testEnumSet();
	}

	/**
	 * 演示枚举类型的遍历
	 */
	private static void testTraversalEnum() {
		Weeks[] days = Weeks.values();
		for (Weeks day : days) {
			System.out.println("TraversalEnum遍历枚举元素name: " + day.getName() + " index:" + day.getIndex());
		}
	}

	/**
	 * 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不过 key 要是枚举类型
	 */
	private static void testEnumMap() {
		// 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是 key 的类的类型
		EnumMap<Weeks, String> currEnumMap = new EnumMap<Weeks, String>(Weeks.class);
		for (Weeks day : Weeks.values()) {
			currEnumMap.put(day, day.name());
		}
		// 2. 遍历对象
		for (Weeks aWeeks : Weeks.values()) {
			System.out.println("EnumMap遍历对象[key=" + aWeeks.getName() + ",value=" + currEnumMap.get(aWeeks) + "]");
		}
	}

	/**
	 * 演示 EnumSet 如何使用, EnumSet 是一个抽象类,是专门为enum实现的集合类常见用法.
	 * 
	 * <pre>
	 * Set是Java集合类的重要组成部分,它用来存储不能重复的对象。
	 * 枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。
	 * 然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。
	 * </pre>
	 */
	private static void testEnumSet() {
		// 获取一个类型的枚举类型内容 , 可以使用 allOf 方法
		EnumSet<Weeks> weekAll = EnumSet.allOf(Weeks.class);
		System.out.println("EnumSet中的所有元素:" + weekAll);
		// Creates an empty enum set with the specified element type.
		EnumSet<Weeks> week = EnumSet.noneOf(Weeks.class);
		week.add(MONDAY);
		System.out.println("EnumSet中添加元素:" + week);
		week.remove(MONDAY);
		System.out.println("EnumSet中删除元素:" + week);
		// Creates an enum set with the same element type as the specified enum set, initially
		// containing all the elements of this type that are not contained in the specified set.
		week.addAll(EnumSet.complementOf(week));
		System.out.println("EnumSet获取全部的元素:" + week);
		week.removeAll(EnumSet.range(MONDAY, THURSDAY));
		System.out.println("EnumSet删除指定元素:" + week); // [FRIDAY, SATURADAY, SUNDAY]
	}

	// 重写toString方法
	// @Override
	// public String toString() {
	// return String.valueOf(this.name);
	// }
	// get set 方法
	public String getName() {
		return name;
	}

	// 应该尽量避免使用该方法
	public void setName(String name) {
		this.name = name;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}
}

通常定义常量方法和枚举定义常量方法区别
1. 以下内容可能有些无聊,但绝对值得一窥

Code:

public class State {
	public static final int ON = 1;
	public static final Int OFF= 0;
}

有什么不好了,大家都这样用了很长时间了,没什么问题啊。
首先,它不是类型安全的。你必须确保是int
其次,你还要确保它的范围是0 和1
最后,很多时候你打印出来的时候,你只看到1和0,但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final 常量吧
2.可以创建一个enum 类,把它看做一个普通的类。除了它不能继承其他类了。(java 是单继承,它已经继承了Enum),可以添加其他方法,覆盖它本身的方法 
3. switch() 参数可以使用enum 了
4. values() 方法是编译器插入到enum 定义中的static 方法,所以,当你将enum 实例向上转型为父类Enum 是,values() 就不可访问了。解决办法:在Class 中有一个getEnumConstants() 方法,所以即便Enum 接口中没有values() 方法,我们仍然可以通过Class 对象取得所有的enum 实例
5. 无法从enum 继承子类,如果需要扩展enum 中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
6. 使用EnumSet 代替标志。enum 要求其成员都是唯一的,但是enum 中不能删除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 对象。
8. enum 允许程序员为eunm 实例编写方法。所以可以为每个enum 实例赋予各自不同的行为。
9. 使用enum 的职责链(Chain of Responsibility) . 这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
10. 使用enum 的状态机
11. 使用enum 多路分发

© 著作权归作者所有

共有 人打赏支持
z
粉丝 1
博文 15
码字总数 4809
作品 0
郑州
程序员
Java中枚举的线程安全性及序列化问题

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

Java填坑之路
08/02
0
0
高阶Java枚举类型enum使用详解

java的Enum枚举类型终于在j2se1.5出现了。之前觉得它只不过是鸡肋而已,可有可无。毕竟这么多年来,没有它,大家不都过得很好吗?今日看《Thinking in Java》4th edition,里面有一句话“有时...

wolf_su
2013/07/22
0
1
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
07/18
0
0
枚举类型可以实现接口,以及枚举类型原理

今天在看 《漫谈设计模式》的时候,看到状态模式的时候,居然发现,枚举类型原来也是可以 实现接口的。 真是涨见识了。 而且 枚举类型的静态属性也是可以 实现方法的, 只是如果没有 实现接口...

之渊
07/24
0
0
为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下。 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient ...

冷_6986
06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx访问日志-日志切割-静态文件不记录日志和过期时间

nginx访问日志: vim /usr/local/nginx/conf/nginx.conf #搜索log_format 该字段定义日志格式,默认如下: #combined_realip日志格式的名字,可随意定义; 定义访问日志: 需在虚拟主机配置文...

ZHENG-JY
4分钟前
0
0
180.mariadb 主从复制

参考:https://blog.csdn.net/chengxuzaza/article/details/62042920 睡觉睡觉,明天写 1.效果 当主库中数据有变化的时候,从库就自动同步 2. 环境要求 至少两台 linux服务器 (教程:https...

Lucky_Me
14分钟前
0
0
erlng file id3v1 id3v1.1

%% ---%% Excerpted from "Programming Erlang",%% published by The Pragmatic Bookshelf.%% Copyrights apply to this code. It may not be used to create training material, %% ......

xueyuse0012
15分钟前
1
0
RabbitMq的安装

环境Centos6.5 32位 JDK 1.7.8 Jdk的卸载 rpm -qa|grep jdk yum –y remove 上边的安装包 JDK的安装 Rpm –ivh jdk安装包 配置环境变量 export JAVA_BIN=/usr/java/jdk1.7.0_80/bin export J......

DemonsI
19分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部