您的位置:首页 > 编程语言 > Java开发

Java枚举类型Enum学习

2016-07-10 00:00 295 查看
摘要: Java 枚举 Enum

项目中大量使用常量定义 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常用方法:

[code=language-java]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=language-java]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 多路分发
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: