简要介绍Java中的枚举类

116 篇文章 22 订阅

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

一、概念
在某些情况下,一个类的对象是有限而且固定的,例如季节类,它只有四个对象,这种实例有限而且固定的类,在Java里被称为枚举类。
手动实现枚举类:
1.通过private将构造器隐藏起来。
2.把这个类的所有可能实例都使用public static final属性来保存。
3.如果有必要,可以提供一些静态方法,允许通过特定参数来获取与之匹配的实例。

请看下面示例:

package com.home;

public class Season {
	private final String name;
	public static final Season SPRING = new Season("春天");
	public static final Season SUMMER = new Season("夏天");
	public static final Season FALL = new Season("秋天");
	public static final Season WINTER = new Season("冬天");

	// 将构造器定义为private
	public Season(String name) {
		super();
		this.name = name;
	}

	// 只提供getter方法
	public String getName() {
		return name;
	}

	/**
	 * 提供一个静态方法获取实例
	 * 
	 * @param seasonNum
	 * @return
	 */
	public static Season getSeason(int seasonNum) {
		switch (seasonNum) {
		case 1:
			return SPRING;
		case 2:
			return SUMMER;
		case 3:
			return FALL;
		case 4:
			return WINTER;
		default:
			return null;
		}
	}
}

二、区别
从上面的示例中可以看出手动定义枚举类是比较麻烦的,我们可以使用关键字enum来定义枚举类,枚举类与普通类的区别:
1.使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。java.lang.Enum类实现了java.lang.Serialiable和java.lang.Comparable两个接口。
2.枚举类的构造器只能使用private修饰,即使省略也默认是private的。
3.枚举类实例只能显示给出,否则永远不能产生实例,列出这些实例时,系统会自动添加public static final修饰,无需程序员显示添加。
4.所有枚举类都提供了一个values方法,用于可以很方便地遍历所有枚举值。

使用enum关键字定义的枚举类示例:

package com.home;

public enum Gender {
	// 此处的枚举值必须调用对应的构造器来创建
	MALE("男"), FEMALE("女");
	private final String name;

	// 枚举类的构造器只能使用private修饰
	private Gender(String name) {
		this.name = name;
	}

	// 只提供getter方法
	public String getName() {
		return name;
	}

	/**
	 * 提供一个静态方法获取实例对应的描述信息
	 * 
	 * @param gender
	 * @return
	 */
	public static String getGenderDisc(Gender gender) {
		// 注意switch表达式中可以是枚举值
		switch (gender) {
		case MALE:
			return "I am a man";
		case FEMALE:
			return "I am a woman";
		default:
			return null;
		}
	}

}


三、枚举类的一些常用方法介绍,请看下面测试类:

package com.home;

public class TestGender {

	public static void main(String[] args) {
		// Gender.values()列出所有枚举值
		for (Gender g : Gender.values()) {
			System.out.println(g);
		}
		// 获取实例可以直接使用EnumClass.variable形式
		Gender gender = Gender.MALE;
		System.out.println(Gender.getGenderDisc(gender));
		// 也可以使用Enum的valueOf方法获取枚举值
		System.out.println(Enum.valueOf(Gender.class, "MALE"));
		// 比较枚举对象的顺序,如果该枚举对象位于指定枚举对象之前,则返回负整数-1;之后,则返回正整数1;否则返回0
		System.out.println(Gender.FEMALE.compareTo(Gender.MALE));
		// name方法大致和toString方法一样,返回枚举常量的名称,一般习惯用toString方法
		System.out.println(Gender.MALE.name());
		// ordinal()返回枚举值的索引值,第一个为0,即从0开始
		System.out.println(Gender.MALE.ordinal());
	}

}


四、实现接口的枚举类

其实枚举类实现接口和普通类没多少区别,也是使用implements关键字,可以实现一个或多个接口。但是需要注意的是,如果像普通类一样实现接口后直接重写接口里的方法的话,那么枚举类的所有实例就拥有一样的接口实现了,这样就失去了意义和灵活性,所以往往会为每个实例提供不同的方法实现,示例如下:

package com.home;

public enum Gender implements GenderDesc {
	MALE("男") {
		// 花括号部分实际上是一个类体部分
		public void info() {
			System.out.println("I am a man");
		}
	},
	FEMALE("女") {
		public void info() {
			System.out.println("I am a woman");
		}
	};
	private final String name;

	// 枚举类的构造器只能使用private修饰
	private Gender(String name) {
		this.name = name;
	}

	// 只提供getter方法
	public String getName() {
		return name;
	}
}

接口:

package com.home;

public interface GenderDesc {
	public void info();
}


五、包含抽象方法的枚举类,枚举类中对普通方法的使用和普通类一样,这里就只介绍其抽象方法的使用,其实抽象方法跟实现接口是一个道理,这里不多说,看示例:

package com.home;

public enum Gender {
	MALE("男") {
		// 花括号部分实际上是一个类体部分
		public String getInfo() {
			return "I am a man";
		}
	},
	FEMALE("女") {
		public String getInfo() {
			return "I am a woman";
		}
	};
	private final String name;

	// 枚举类的构造器只能使用private修饰
	private Gender(String name) {
		this.name = name;
	}

	// 只提供getter方法
	public String getName() {
		return name;
	}

	// 为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同实现
	public abstract String getInfo();
}


注意:上面枚举类中定义了抽象方法,但是,类却没用abstract修饰,这点跟普通类不一样,因为枚举类需要显示创建枚举值,并为抽象方法提供实现,否则会出现编译错误。


 


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值