Thinking in Java 之 枚举篇

所有的枚举类都是java.lang.Enum的子类,所以自定义的枚举类无法继承其它类

枚举类的常用方法:

values():

是由编译器加入到自定义的enum类中的static方法

ordinal()

valueOf

package com.demo.enums;

/**
 * @author wobendiankun
 *2014-10-28 下午10:09:53
 */
public class EnumsTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		valueList();
		ordinal();
		valueOf("A");//A
		valueOf("F");//java.lang.IllegalArgumentException: No enum const class com.demo.enums.GradeType.F
	}

	private static void valueOf(String type) {
		System.out.println();
		System.out.println(GradeType.valueOf(type));
	}

	private static void ordinal() {
		System.out.println();
		//获取枚举常量的序数
		for(GradeType type:GradeType.values()){
			System.out.print(type.ordinal()+"\t");//0	1	2	3	4
		}
	}

	private static void valueList() {
		//获取枚举的所有值
		for(GradeType type:GradeType.values()){
			System.out.print(type+"\t");// A	B	C	D	E
		}
	}

}
enum GradeType {
	A,B,C,D,E
}

通过Class对象获取所有枚举常量

private static void getValuesByClass() {
		for(GradeType type:GradeType.class.getEnumConstants()){
			System.out.print(type+"\t");//A		B	C	D	E
		}
		System.out.println();
	}

为枚举类添加新方法

注意点:

1.不能继承除Enum之外,当作一个普通java类
2.必须先定义enum的实例,在实例序列最后面添加分号
3.构造访问团限制为private或default
package com.demo.enums;

public class EnumMethodTest {
	enum GradeType {
		//枚举实例
		A(85),B(75),C(65),D(59);
		private int score ;

		private GradeType(int score) {
			this.score = score;
		}

		public int getScore() {
			return score;
		}

	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GradeType type=GradeType.valueOf("A");
		System.out.println("成绩:"+type.getScore());//成绩:85
	}

}

A():调用枚举的构造函数

利用接口来组织枚举

部门A中有两个项目组B、C,部门领导希望能够统一每个项目组所抛出的异常码与异常信息,做了统一的规划,各项目组可以扩展自己的异常码

类图:

DepAErrorCode:

package com.demo.enums.orga;

/**异常码接口
 * @author wobendiankun
 *2014-10-28 下午10:45:23
 */
public interface DepAErrorCode {
	/**获取错误码
	 * @return
	 */
	String getCode();
	/**获取错误信息
	 * @return
	 */
	String getDesc();
}

ProjectBErrorCode

package com.demo.enums.orga;

/**项目组B错误码接口
 * @author wobendiankun
 *2014-10-28 下午10:50:00
 */
public interface ProjectBErrorCode extends DepAErrorCode {

}

ProjectCErrorCode

package com.demo.enums.orga;

/**项目组C错误码接口
 * @author wobendiankun
 *2014-10-28 下午10:50:00
 */
public interface ProjectCErrorCode extends DepAErrorCode {

}

ProjectBCode

package com.demo.enums.orga;

/**
 * @author wobendiankun
 *2014-10-28 下午10:58:47
 */
public enum ProjectBCode implements ProjectBErrorCode{
	ADD_USER("10001","添加用户失败"),
	DELETE_USER("10002","删除用户失败");
	private String code;
	private String desc;

	private ProjectBCode(String code, String desc) {
		this.code = code;
		this.desc = desc;
	}

	@Override
	public String getCode() {
		return this.code;
	}

	@Override
	public String getDesc() {
		return this.desc;
	}

}

DepAException

package com.demo.enums.orga;

/**
 * @author wobendiankun
 *2014-10-28 下午10:45:43
 */
public class DepAException extends RuntimeException {
	public DepAException(DepAErrorCode depAErrorCode) {
		super(getMsg(depAErrorCode));
	}
	static String getMsg(DepAErrorCode depAErrorCode){
		return "错误码:"+depAErrorCode.getCode()+",错误信息:"+depAErrorCode.getDesc();
	}

}

ErrorCodeTest

package com.demo.enums.orga;

/**
 * @author wobendiankun
 *2014-10-28 下午10:58:40
 */
public class ErrorCodeTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		add();//com.demo.enums.orga.DepAException: 错误码:10001,错误信息:添加用户失败
	}

	private static void add() {
		new UserSerivce().add();
	}

}
class UserSerivce{
	void add(){
		throw new DepAException(ProjectBCode.ADD_USER);
	}
}

枚举定义抽象方法

package com.demo.enums;

/**
 * @author wobendiankun
 *2014-10-28 下午11:13:19
 */
public class EnumAbstractTest {
	enum GradeType {
		A(){

			@Override
			void print() {
				System.out.println("优秀");
			}

		},
		B(){

			@Override
			void print() {
				System.out.println("良");
			}

		};
		//定义一个抽象方法
		abstract void print();
	}
	public static void main(String[] args) {
		GradeType type=GradeType.B;
		type.print();//良
	}
}

EnumSet & EnumMap

public class EnumSetTest {

      /**
      * @param args
      */
      public static void main(String[] args) {
           EnumSet<Type > set= EnumSet.allOf( Type.class);
           print(set );
           set=EnumSet .noneOf( Type.class);
           print(set );
           set=EnumSet .of( Type.AA , Type. CC);
           print(set );
     }
      static void  print(EnumSet <Type> set){
           System.out .println(set);
     }
}
enum Type {
      AA,BB ,CC, DD,EE ,FF

}
public class EnumMapTest {
      static EnumMap <Type, InvokeHandler> map = new EnumMap<Type , InvokeHandler>(
               Type.class);

      static void init() {
           map.put(Type .AA, new InvokeHandler() {

               @Override
               public void handle() {
                    System.out .println("处理了 AA...");
              }
          });
           map.put(Type .CC, new InvokeHandler() {

               @Override
               public void handle() {
                    System.out .println("处理了 CC...");
              }
          });
     }

      /**
      * @param args
      */
      public static void main(String[] args) {
           init();
           map.get(Type .CC). handle();
           map.get(Type .AA). handle();
           map.get(Type .DD). handle();
     }

}

interface InvokeHandler {
      void handle();
}
时间: 2024-10-05 04:58:31

Thinking in Java 之 枚举篇的相关文章

Java核心 --- 枚举

Java核心 --- 枚举 枚举把显示的变量与逻辑的数字绑定在一起在编译的时候,就会发现数据不合法也起到了使程序更加易读,规范代码的作用 一.用普通类的方式实现枚举 新建一个终态类Season,把构造方法设为私有,因为枚举值不能随意增加因为不能new出这个类的对象,所以需要定义成员变量,把new写在类的内部这样,就可以在类的外部通过访问类的静态成员变量的方式访问到枚举值通过这样的方式,只能在类的外部使用在枚举类的内部定义的枚举值 类Season里面是可以有方法的,我们设置地球又公转了四分之一方法

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

Java中枚举的使用

一. JDK5之前的实现方式 在枚举类型出现之前,java是通过在接口或者类中定义public static final 的变量来实现的. 比如对于四季的描述: --------------------------------------------------------------------------------- public interface Season {    public static final int SEASON_SPRINT = 1;    public stati

JAVA Web学习篇--Servlet

Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中.假设是这样,除了负责显示的HTML标记之外,必须还要有完毕这些业务功能的代码存在.这样的网页我们就叫做动态网页. 对于静态网页而言,server上存在的是一个个纯HTML文件.当client浏览器发出HTTP请求时,server能够依据请求的URL找到相应的HTML文件,并将HTML代码返回给cl

学习java随笔第九篇:java异常处理

在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally语句 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally { //此处是肯定被执行的代码 } 抛出异常 使用thows和throw语句抛出异常 public static vo

java的枚举2

首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class Grade { public void test() { print(grade.A); } public void print(grade g) { //print A B C D E } } /*class grade{ private grade(){} public static final

java权限系统设计篇

数据库表设计 1.1.1.   模块管理(jk_module) 项 类型 说明 id long 就是数据库记录idx号 name string 模块名称 orderid int 排序id  由小到大显示 deleted int 默认0 (0 正常  1删除状态) 1.1.2.   模块功能管理(jk_module_fun) 项 类型 说明 id long 就是数据库记录idx号 moduleid long 所属模块 name string 功能名称 urls string 功能url集合 ord

热烈庆祝【深入浅出Java虚拟机——入门篇】培训课程在51CTO上线了

我的视频[深入浅出Java虚拟机--入门篇]在51CTO学院上线了. 想了解的可以点击: http://edu.51cto.com/course/course_id-1952.html 课程框架如下: 1.jvm概述 2.java规范和JVM规范简述 3.生活中的数字在计算机中的表示 4.jvm内存划分 5.jvm内存模型 6.jvm调试跟踪参数 7.jvm内存控制上 8.jvm内存控制下 9.jvm中class的装载过程 10.jvm中classloader的设计模式 11.jvm中有关cla

java web进阶篇(三) 表达式语言

表达式语言(Expression Language ,EL)是jsp2.0中新增的功能.可以避免出现许多的Scriptlet代码 格式: ${ 属性名称 },  使用表达式语言可以方便的访问对象中的属性,提交的参数或者进行各种数学运算,而且使用表达式语言最大的特点是如果输出的内容是null,则会自动使用空字符串("")表示. <%request.setAttribute("name", "info");%> <h1>${n