Java枚举类

1.什么是枚举

枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型  。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。


2.早期的枚举和它所存在的问题

/*
 * @author WLNSSS
 * @time 2018.1.18
 * */
public class Test {
	
	//早期没有枚举类的时候,使用这种简单的静态代码来表示枚举
	public static int SEASON_SPRING = 1;
	public static int SEASON_SUMMER = 2;
	public static int SEASON_FALL = 3;
	public static int SEASON_WINTER = 4;

}
这种定义的方法十分的简单,但是也存在比较多的问题。

2.1 类型不安全
上面的每个季节实际上是int类型,因此完全可以把它当成整数用,两个季节进行相加,这样的代码也是正确的。

2.2 没有命名空间:
当需要使用季节时,必须在SPRING前使用SEASON_前缀,否则程序可能与其他类中的静态类常量混淆。

2.3 打印输出的意义不明确
当输出某个季节时,例如输出SEASON_SPRING,实际输出的是1,则很难猜测它的含义是什么

3.枚举类入门


Java5新增了一个enum关键字用来定义枚举类。所谓的枚举类也只是一个特殊的类,它有着类的绝大多数的特性
,但是一个java源文件最多只能定义一个public访问权限的枚举类,且该源文件也必须和该枚举类的类名相同。
但是枚举类也仅仅只是特殊的类而已,还是有以下区别的:

3.1
枚举类可以实现一个或多个的接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承
Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.serializable和
java.lang.Comparable两个接口

3.2
使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。

3.3
枚举类的构造器只能使用private访问控制符

3.4
枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远也不能产生实例,列出这些实例,系统
会自动添加public static final 修饰,无须显式添加。

还有枚举类默认提供values()方法,这个方法可以遍历所有枚举类的值。


例如下面定义了一个枚举类:

package emuntest;

public enum SeasonEnum {
	
	SPRING,SUMMER,FALL,WINTER;

}
package emuntest;

public class EnumTest {

	public void judge(SeasonEnum s) {

		switch (s) {
		case SPRING:
			System.out.println("spring");
			break;
		case SUMMER:
			System.out.println("summer");
			break;
		case FALL:
			System.out.println("fall");
			break;
		case WINTER:
			System.out.println("winter");
			break;
			default:;

		}
	}
	
	public static void main(String[] args) {
		
		for(SeasonEnum s : SeasonEnum.values()) {
			System.out.println(s);
		}
		
		new EnumTest().judge(SeasonEnum.SPRING);
	}

}

4.枚举类也可以有自己的成员变量,方法和函数


例如
package com;
 
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 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;
    }
     
 
}


5.注意事项

抽象枚举类是可以继承的,枚举类使用相对较少。谢谢各位。



你可能感兴趣的:(java进阶)