Java读书笔记十六(Java中的枚举类)

Java学习 专栏收录该内容
128 篇文章 1 订阅

 

 前言

 在java开发中,有时候一个类的对象是有限而且固定的,比如我们常见的季节类,就是春夏秋冬。只有这四个简单的对象而已,这些实例有限而且固定的类,在java中,被称为枚举类。

 

 什么是枚举类?

 在以前的代码中,可能会直接使用简单的静态常量来表示枚举,例如以下所示

 

 public static final String TURN_FLATTEN_QUEUE_EXCEPTION = "turn-flatten-queue-exception";
    public static final String CSR_BY_HIERARCHY = "csr-by-hierarchy";
    public static final String CSR_BY_TASK = "csr-by-task";
    public static final String CSR_BY_UPDATE = "csr-by-update";

 但是以上的代码看起来有点罗嗦,并且也不知道每个变量的实际含义。所以java5中增加了Enum关键字,它与平常的class,interface关键字的地位相同,都用来定义枚举类。但是它又与平常的类有区别,区别如下所示:

 1.枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类。

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

 3.枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private。

 4.枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不可能产生实例。


 enum Color {
	RED, GREEN, BLANK, YELLOW;

}
 

 枚举类的成员变量和构造器

 枚举类也是一种类,只是有些地方比较特殊而已,因此它也可以定义成员变量、方法和构造器。


 Gender类

 

package com.test;
public enum Gender {

	MAILE,FEMALE;
	//定义一个public修饰的实例变量
	public String name;
	
}

GenderTest类

 

package com.test;


public class GenderTest {

	public static void main(String[] args) {
		// 通过Enum的valueof()方法来获得指定枚举类的枚举值
		Gender gender = Enum.valueOf(Gender.class, "FEMALE");
		// 直接为枚举值的name实例变量赋值
		gender.name = "女";
		System.out.println(gender.name);
	}
}

 正如上述所示,在枚举类中定义变量,并且为变量赋值,但实际这样做并不好,枚举类通常应该设计为不可变类,也就是说,它的成员变量值不应该运行改变。这样会更加安全,而且代码更加简洁。因此我们可以通过构造器来传参。

package com.test;
public enum Gender {

	MAILE("男"),FEMALE("女");
	//定义一个public修饰的实例变量
	public String name;
	
	//枚举构造器只能通过private修饰
	private Gender(String name){
		this.name=name;
	}

	public String getName() {
		return name;
	}

}


 实现了接口的枚举类

 

/**     
 * @FileName: Gender2.java   
 * @Package:com.test   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月1日 下午3:10:39   
 * @version V1.0     
 */
package com.test;

/**  
 * @ClassName: Gender2   
 * @Description: TODO  
 * @author: LUCKY  
 * @date:2015年12月1日 下午3:10:39     
 */

interface GenderDesc{
	void info();
}

public enum Gender2 implements GenderDesc {

//	MAILE,FEMALE;
//
//	public void info() {
//	   System.out.println("实现的代码如下");
//	}
	
	MAILE{
	
		public void info() {
		   System.out.println("我是男生");		
		}	
	},
	
	
	FEMAIL{

		public void info() {
		  System.out.println("我是女生");
		}
		
	}
}


class test{
	public static void main(String[] args) {
		Gender2.FEMALE.info();
	}
}

 正如上述代码所示,有两种方法分别实现了接口。


 包含抽象方法的枚举类

  假设有一个Operation类枚举类,它的4个枚举值PLUS,MIUS,TIMES,DIVIDES分别代表加减乘除,除了这几个对象外,还需要为枚举类定义一个计算的方法。

/**     
 * @FileName: Operation.java   
 * @Package:com.test   
 * @Description: TODO  
 * @author: LUCKY    
 * @date:2015年12月1日 下午3:16:05   
 * @version V1.0     
 */
package com.test;

/**
 * @ClassName: Operation
 * @Description: TODO
 * @author: LUCKY
 * @date:2015年12月1日 下午3:16:05
 */
public enum Operation {
	PLUS {

		public double eval(double x, double y) {
			return x+y;
		}

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



  • 0
    点赞
  • 3
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值