Java基础知识整理3:Enum

Java基础知识整理3:Enum

JDK描述

public abstract class Enum<E extends Enum>
extends Object
implements Comparable, Serializable
这是所有 Java 语言枚举类型的公共基本类。

Enum使用

http://www.ibm.com/developerworks/cn/java/j-lo-enum/

  • 作用:将一组类似的值包含到一种类型当中。Java常量也可以实现
public static class RainbowColor { 
    public static final int RED = 0; 
}

但是,有几个缺点:接收颜色的方法接收一个int型,如果传任意的int值会造成错误;必须通过类来访问;

  • 定义和使用
public enum Colors {
    //必须写在首行
	RED(200,"RED_COLOR"),
	YELLOW(201,"YELLOW_COLOR"),
	BLACK(202,"BLACK_COLOR");
	int color;
	String colorName;
	private Colors(int color,String name){
		this.color=color;
		this.colorName=name;
	}
	public String getColorName() { 
       return this.colorName;
    } 
}


//直接使用
System.out.println("RED"==Colors.RED.getColorName());
//switch
switch(today) {
	case  BLACK:  break; 
	case  RED:  break; 
	case  YELLOW:  break; 
}
  • 相关工具类
//1.EnumSet遍历枚举
for(Colors day : EnumSet.range(Colors.RED, Colors.BLACK)) { 
    System.out.println(day); 
}
//2.EnumMap,将枚举作为key,
//EnumMap的可以必须是Enum类型,在put时调用typeCheck(key);进行检查,必须是传入的Colors.class
Map<Colors, Integer> schema = new EnumMap<Colors, Integer>(Colors.class);
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>

代码分析

Enum实现接口

  • Comparable接口用来进行比较
  • Serializable 序列化

Enum的变量

  • private final String name; 枚举的名字,如上面的Colors.RED的名字为"RED"
  • private final int ordinal; 枚举的index

字符数组和offset及count都是final的,必须在构造方法中初始化,之后不能修改。

构造方法

  • protected Enum(String name, int ordinal) 构造方法是protected不能通过构造函数创建
RED(200,"RED_COLOR"),
YELLOW(201,"YELLOW_COLOR"),
BLACK(202,"BLACK_COLOR");
定义枚举变量时会调用枚举的构造方法,传入(RED,0)/(YELLOW,1)/(BLACK,2)

enum Type{
    A,B,C,D;
}
//编译器会进行处理,相当于
class Type extends Enum{
    public static final Type A;
    public static final Type B;
    ...
}

其他方法

  • public final String name() 获取枚举的名字 Colors.YELLOW为"YELLOW"
  • public final int ordinal() 获取枚举的名字 Colors.YELLOW为1
  • public final int compareTo(E o) 比较两个枚举
  • values(); Colors.values()返回一个Colors的数组

相关问题

利用枚举实现单例模式

  • 单元素的枚举类型已经成为实现Singleton的最佳方法。
class Resource{
}

public enum SomeThing {
    INSTANCE;
    private Resource instance;
    SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }
}

SomeThing.INSTANCE.getInstance()即可获得单例

总结

posted @ 2017-02-11 21:47  尅皮埃  阅读(148)  评论(0)    收藏  举报