Java学习笔记-枚举类

实例有限且固定的类成为枚举类

枚举类的实现

  • 早期时候的实现形式:
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FAIL = 3;
public static final int SEASON_WINTER = 4;
  • 这种方式虽然实现简单,但存在很多问题:
    ①类型不安全(二者可运算)
    ②没有命名空间
    ③打印输出的意义不明确

如今的枚举实现:

  • Java5以后增加了enum关键字(与class、interface地位相同)来定义枚举。可以拥有成员变量、方法,可以实现一个或多个接口,也可定义构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同
  • 枚举类与普通类的区别:
    • 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
    • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
    • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private
    • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例
  • 枚举类默认提供了一个value()方法,该方法可以很便捷的遍历所有的枚举值
public enum SeasonEnum{
	SPRING,SUMMER,FAIL,WINTER;
}
  • 在使用时候可以这样:SeasonEnum.SPRING。在switch使用时可直接用SPRING
  • java.lang.Enum类提供了以下方法:
    • int compareTo (E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能和相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负数,否则返回零
    • String name():返回枚举实例的名称
    • int ordinal():返回枚举值在枚举类中的索引值
    • String toString():返回枚举常量的名称
    • public static <T extends Enum<T>>T valueOf(Class<T> enumType,String name):返回指定枚举类中指定名称的枚举值

枚举类的成员变量、方法和构造函数

public enum Gender {
	MALE,FEMALE;
	// 定义一个public修饰的实例变量
	public String name;
}
public enum Gender{
	MALE,FEMALE;
	private String name;
	public void setName(String name){
		switch (this){
			case MALE:
				if (name.equals("男")){
					this.name = name;
				}else{
					System.out.println("参数错误");
					return;
				}
				break;
			case FEMALE:
				if (name.equals("女")){
					this.name = name;
				}else{
					System.out.println("参数错误");
					return;
				}
				break;
		}
	}
	public String getName(){
		return this.name;
	}
}
public enum Gender{
	// 此处的枚举值必须调用对应构造器来创建
	MALE("男"),FEMALE("女");
	private final String name;
	// 枚举类的构造器只能使用private修饰
	private Gender(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
}
  • 其实也就相当于以下代码:
public static final Gender MALE = new Gender("男");
public static final Gender FEMALE = new Gender("女");

实现接口的枚举类

public enum Gender implements GenderDesc{
	// 此处的枚举值必须调用对应构造器来创建
	MALE("男")
	// 花括号部分实际上是一个类体部分
	{
		public void info(){
			System.out.println("这个枚举值代表男性");
		}
	},
	FEMALE("女"){
		public void info(){
			System.out.println("这个枚举值代表女性");
		}
	};
	private final String name;
	// 枚举类的构造器只能使用private修饰
	private Gender(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	// 增加下面的info()方法,实现GenderDesc接口必须实现的方法
	public void info(){
		System.out.println("这是一个用于用于定义性别的枚举类");
	}
}
  • 以上就是由匿名子类实现的

包含抽象方法的枚举类

public enum Operation{
	PLUS{
		public double eval(double x , double y){
			return x + y;
		}
	},
	MINUS{
		public double eval(double x , double y){
			return x - y;
		}
	},
	TIMES{
		public double eval(double x , double y){
			return x * y;
		}
	},
	DIVIDE{
		public double eval(double x , double y){
			return x / y;
		}
	};
	// 为枚举类定义一个抽象方法
	// 这个抽象方法由不同的枚举值提供不同的实现
	public abstract double eval(double x, double y);
	public static void main(String[] args){
		System.out.println(Operation.PLUS.eval(3, 4));
		System.out.println(Operation.MINUS.eval(5, 4));
		System.out.println(Operation.TIMES.eval(5, 4));
		System.out.println(Operation.DIVIDE.eval(5, 4));
	}
}
原文地址:https://www.cnblogs.com/cj5785/p/10664845.html