国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > java知识总结(十二)枚举

java知识总结(十二)枚举

来源:程序员人生   发布时间:2017-03-06 10:12:39 阅读次数:2467次

原文来自搬砖工,如需转载请注明出处


这篇文章从认识枚举、枚举详解到枚举使用举例来总结java枚举的相干知识

1、认识枚举

枚举类型是Java SE 5.0 以后的版本新定义出来的,我们先来简单看1个枚举的定义:

public enum Color{
	RED,BLUE,BLACK,YELLOW,GREEN
}
明显,enum很像特殊的class类,实际上enum声明定义的类型就是1个类。 而这些类都是类库中Enum类的子类(Java.lang.Enum)。它们继承了这个Enum中的许多有用的方法。我们对代码编译以后发现,编译器将 enum类型单独编译成了1个字节码文件——Color.class

文件内容:

final enum hr.test.Color {
	// 所有的枚举值都是类静态常量
	public static final enum hr.test.Color RED;
	public static final enum hr.test.Color BLUE;
	public static final enum hr.test.Color BLACK;
	public static final enum hr.test.Color YELLOW;
	public static final enum hr.test.Color GREEN;
	private static final synthetic hr.test.Color[] ENUM$VALUES;
}
2、枚举详解

下面以Color类为例总结1下枚举的相干知识:

1. Color枚举类就是class,而且是1个不可以被继承的final类。其枚举值(RED,BLUE......)都是Color类型的类静态常量, 我们可以通过下面的方式来得到Color枚举类的1个实例:

Color c=Color.RED;
注意:这些枚举值都是public static final的,也就是我们常常所定义的常量方式,因此枚举类中的枚举值最好全部大写。

2. 即然枚举类是class,固然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:

(1)构造器只是在构造枚举值的时候被调用

enum Color{
	RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
	//构造枚举值,比如RED(255,0,0)
	private Color(int rv,int gv,int bv){
		this.redValue=rv;
		this.greenValue=gv;
		this.blueValue=bv;
	}
	public String toString(){ //覆盖了父类Enum的toString()
		return super.toString()+“(”+redValue+“,”+greenValue+“,”+blueValue+“)”;
	}
	private int redValue; //自定义数据域,private为了封装。
	private int greenValue;
	private int blueValue;
}
(2) 构造器只能私有private,绝对不允许有public构造器。 这样可以保证外部代码没法新构造枚举类的实例。这也是完全符合情理的,由于我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。

public static void main(String args[]){
	// Color colors=new Color(100,200,300); //wrong
	Color color=Color.RED;
	System.out.println(color); // 调用了toString()方法
}
3. 所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法:

(1)ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。

Color.RED.ordinal(); //返回结果:0
Color.BLUE.ordinal(); //返回结果:1
(2)compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺 序之差。固然,条件是两个枚举值必须属于同1个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)

Color.RED.compareTo(Color.BLUE); //返回结果 ⑴
(3)values()方法: 静态方法,返回1个包括全部枚举值的数组:

Color [] colors=Color.values();
for(Color c:colors){
	System.out.print(c+“,”);
}//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
(4)toString()方法: 返回枚举常量的名称

Color c=Color.RED;
System.out.println(c);//返回结果: RED
(5)valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。

Color.valueOf(“BLUE”); //返回结果: Color.BLUE
(6)equals()方法: 比较两个枚举类对象的援用。

public final boolean equals(Object other) {
	return this==other;
}
4. 枚举类可以在switch语句中使用。

Color color=Color.RED;
switch(color){
	case RED: System.out.println("it‘s red");break;
	case BLUE: System.out.println("it’s blue");break;
	case BLACK: System.out.println("it‘s blue");break;
}
3、枚举的具体使用

用法1:常量
在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相干的常量分组到1个枚举类型里,而且枚举提供了比常量更多的方法。

public enum Color {  
	RED, GREEN, BLANK, YELLOW  
} 
用法2:switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

enum Signal {  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Signal color = Signal.RED;  
    public void change() {  
        switch (color) {  
        case RED:  
            color = Signal.GREEN;  
            break;  
        case YELLOW:  
            color = Signal.RED;  
            break;  
        case GREEN:  
            color = Signal.YELLOW;  
            break;  
        }  
    }  
} 
用法3:向枚举中添加新方法
如果打算自定义自己的方法,那末必须在enum实例序列的最后添加1个分号。而且 Java 要求必须先定义 enum 实例。

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    // 普通方法  
    public static String getName(int index) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return c.name;  
            }  
        }  
        return null;  
    }  
    // 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;  
    }  
}
用法4:覆盖枚举的方法
下面给出1个toString()方法覆盖的例子。

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    //覆盖方法  
    @Override  
    public String toString() {  
        return this.index+"_"+this.name;  
    }  
}
用法5:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {  
    void print();  
    String getInfo();  
}  
public enum Color implements Behaviour{  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
//接口方法  
    @Override  
    public String getInfo() {  
        return this.name;  
    }  
    //接口方法  
    @Override  
    public void print() {  
        System.out.println(this.index+":"+this.name);  
    }  
}
用法6:使用接口组织枚举

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}
用法7:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

4、替换枚举的常见方法

class   WeekDay{  
    public static final WeekDay SUN = new WeekDay();  
    public static final WeekDay MON = new WeekDay();  
    public static final WeekDay TUE = new WeekDay();  
    public static final WeekDay WED = new WeekDay();  
    public static final WeekDay THU = new WeekDay();  
    public static final WeekDay FRI = new WeekDay();  
    public static final WeekDay SAT = new WeekDay();  
    public String toString(){  
        if(this==SUN)   
        return "SUN";  
        else if (this==MON) return "MON";  
        else if (this==TUE) return "TUE";  
        else if (this==WED) return "WED";  
        else if (this==THU) return "THU";  
        else if (this==FRI) return "FRI";  
        else  return "SAT";  
    }  
    public static void main(String [] args){  
        WeekDay weekDay = WeekDay.SUN;  
        System.out.println(weekDay.toString());  
    }  
}
5、小结

1.enum类型可以放在switch语句中进行判断。
2.String toString()  返回枚举常量名
3.int ordinal()   返回枚举常量在enum声明中的位置   位置从0开始计数
4.int  compareTo(E other)   如果枚举常量出现在other之前,则返回1个负值;如果this==other ,返回0,否则返回1个正值
5.Size[] values = Size.values();     enum类有1个values的方法,  可以返回1个enum类型的数组,也能够用enum.values().length() 取得枚举类型变量的长度。














生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生