文档章节

Java枚举类型Enum学习

z
 zhancy01
发布于 2016/07/10 23:57
字数 1244
阅读 27
收藏 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填坑之路
2018/08/02
0
0
Java 枚举(enum) 详解7种常见的用法

版权声明:觉得此文有用的,不嫌麻烦的,就留个言呐,或者点个赞呐(额,就是文章底部的“顶”啦),要是嫌弃麻烦呢,也麻烦点个赞嘛,要是实在不想点赞呢,也不是不可以。 但是,你要是想踩一...

李学凯
2016/08/11
0
0
java 枚举(enum) 全面解读

简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类....

jimmie_yang
2018/10/19
0
0
高阶Java枚举类型enum使用详解

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

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

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

海岸线的曙光
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

tac 与cat

tac从后往前看文件,结合grep使用

writeademo
今天
2
0
表单中readonly和dsabled的区别

这两种写法都会使显示出来的文本框不能输入文字, 但disabled会使文本框变灰,而且通过通过表单提交时,获取不到文本框中的value值(如果有的话), 而readonly只是使文本框不能输入,外观没...

少年已不再年少
今天
2
0
SpringBoot上传图片操作

首先有个上传文件的工具类 /** * 文件上传 * @param file * @param filePath * @param fileName * @throws Exception */public static void uploadFile(byte[] file, String ...

_liucui_
今天
6
0
DrawerLayout

public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener,OnFragmentInteractionListener{ public NavigationView navView; ......

安卓工程师王恒
今天
2
0
python精简笔记

python精简笔记-字符串基本用法 字符串常见用法: * encode() # 编码成bytes类型 * find() # 查找子串 * index() # 获取下标 * replace() # 替换子串 * len(string) # 返回字符串长度,...

平头哥-Enjoystudy
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部