我奶奶都能懂java枚举类型

Posted 浦江之猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我奶奶都能懂java枚举类型相关的知识,希望对你有一定的参考价值。

本不打算写枚举的,但最近在review同事的代码时,发现大家对枚举类型的使用不是很到位,当问他们枚举类型相关概念时,他们都不是很清楚,回答的是:用到的时候再去网上查一下。个人觉得,搞开发要有一个基础知识体系,这些知识要信手拈来。说实话,枚举类型用的不是很多,但是只要用到枚举的地方,必能提高代码的可读性。希望这篇博客能帮助基础薄弱的同学。
示例的源码可以直接通过csdn下载,也可以通过git导出:https://github.com/igdnss/java_enum.git

定义

所谓的枚举就是一一列举出来的意思,那么枚举类型就是一个能将使用到的常量一一列举出来的类型,它是一个特殊的数据类型,能够为一个变量定义一组预定义的常量,例如“周几”这个变量,我们可以为其预定义一组常量,从周一到周日并放入到一个类中,那么这个类就叫着“周几”的枚举类,也就是说将所有可能的值都列举出来再用一个类进行封装。由于枚举类型属于java类中的一种,因此它也可以拥有成员变量和方法。

结构

正常的类定义时使用class关键字,而枚举类型使用enum,包括枚举项,构造方法(注意:这里是私有的),成员变量,成员方法。其中枚举项相对于正常的class它是一个新的概念,在枚举类中枚举项是就是这个类的对象(跟正常的类不一样,注意区分,下文中会举例,相信你会明白),因此它会有自己的属性(变量和方法),所以在定义枚举项时可以调用构造方法,不调用的话直接默认为无参构造方法。

//枚举类的结构,注意关键字是enum
public enum 枚举类名{
	枚举项1,枚举项2,枚举项3...;
	构造方法 //private 
	成员变量
	成员方法
}

使用

正常情况下,如果使用到很多常量,而这些常量可以用在同一个业务场景,那么建议使用枚举类型。例如,隔壁老王干完坏事开溜,可以选择从正门出走楼梯,也可以选择从窗户跳下去,也可以选择躲在衣柜里继续睡,这三种情况都对应着老王“逃”的这个业务场景,因此可以将这三种情况封装成枚举类型。在使用之前强调4点

  • 枚举类型都继承java.lang.Enum,所以枚举类不能再继承其它类型。
  • 定义枚举项时,多个枚举项之间需要使用“,”隔开,通常使用大写,因为它是一个常量,所以按照java的惯例应该使用大写。
  • 枚举类型的构造方法使用private
  • 通过枚举类名.枚举项名称去访问指定的枚举项
  • 枚举类型可以实现接口

普通用法

示例1:不使用枚举类型

/**
 *常量类
 */
public class Escape {
	public final static String DOOR = "老公没到小区";
	public final static String DOOR_OPERATION = "从正门出去";
	
	public final static String WINDOW = "老公上楼了";
	public final static String WINDOW_OPERATION = "翻窗子出去";
	
	public final static String CABINET = "老公进客厅了";
	public final static String CABINET_OPERATION = "不行了,躲柜子里";

}

在不使用枚举的情况,用了一堆常量,不方便维护。

示例2:使用枚举类型

public enum EscapeEnum {
	//定义枚举项
	DOOR("老公没到小区","从正门出去"),
	WINDOW("老公上楼了","翻窗子出去"),
	CABINET("老公进客厅了","不行了,躲柜子里");
	private String location;
	private String operation;
	
	
	//private 构造方法
	private EscapeEnum() {}

	private EscapeEnum(String location, String operation) {
		this.location = location;
		this.operation = operation;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public String getOperation() {
		return operation;
	}

	public void setOperation(String operation) {
		this.operation = operation;
	}	
}

使用枚举类型后,之前的成对常量都被封装在枚举项中了,可读性明显增强。

public class EnumTest {

	public static void main(String[] args) {
		//枚举项就是一个对象
		EscapeEnum door = EscapeEnum.DOOR;
		System.out.println(door.getLocation());
		System.out.println(door.getOperation());
	}

}

枚举比较

枚举的比较通过用在条件分支中,例如switch case中,if中使用的话使用"=="

示例1:switch中进行比较

public class CompareSwitchTest {
	public static void main(String[] args) {
		EscapeEnum escapeEnum = EscapeEnum.DOOR;
		switch(escapeEnum) {
		case DOOR:
			System.out.println("从正门出去");
			break;
		case WINDOW:
			System.out.println("翻窗子出去");
			break;
		case CABINET:
			System.out.println("不行了,躲柜子里");
			break;
		default:break;
		}
	}
}

示例2:if分支中进行比较

public class CompareIfTest {
	public static void main(String[] args) {
		EscapeEnum escapeEnum = EscapeEnum.DOOR;
		if(escapeEnum == EscapeEnum.DOOR) {
			System.out.println("从正门出去");
		}else if (escapeEnum == EscapeEnum.WINDOW) {
			System.out.println("翻窗子出去");
		}else if(escapeEnum == EscapeEnum.CABINET) {
			System.out.println("不行了,躲柜子里");
		}
	}
}

枚举类型实现接口

枚举类型可以实现接口,实现的方式跟普通的类没什么区别。

示例:模拟HttpCode

/**
 *HttpCode接口
 */
public interface HttpCode {
	int getCode();
	String getDescription();

}
/**
 *枚举类实现接口
 */
public enum HttpCodeEnum implements HttpCode{
	SUCCESS(200,"ok"),
	PAGE_NOT_FOUND(404,"page not found")
	;
	
	int code;
	String description;
	

	private HttpCodeEnum(int code, String description) {
		this.code = code;
		this.description = description;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	@Override
	public int getCode() {
		return code;
	}

	@Override
	public String getDescription() {
		return description;
	}

}
public class CodeTest {
	public static void main(String[] args) {
		HttpCode codeEnum = HttpCodeEnum.SUCCESS;
		System.out.println("The code is : "+codeEnum.getCode()+
				" The description is : "+codeEnum.getDescription());
	}

}

结束语

至此,关于java枚举类型的知识点就介绍完了。希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!

以上是关于我奶奶都能懂java枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

我奶奶都能懂java泛型

我奶奶都能懂java异常

我奶奶都能懂java8特性-日期时间

我奶奶都能懂java子类构造方法

我奶奶都能懂java8特性-lambda表达试

我奶奶都能懂docker基本操作