Java基础&增强 枚举

原创 2013年12月02日 23:17:40

           ---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

            枚举 ,JKD5.0引入的重磅新新特性。

            枚举用起来非常方便,也非常实用:

     

public enum Operations {
	
	PLUS,MINUS,TIMES,DEVIDE;
	
	public double apply(double x, double y){
		switch(this){
		case  PLUS : return x + y; 
		case  MINUS : return x - y;
		case TIMES : return x * y;
		case DEVIDE : return x / y;
		}
		throw new RuntimeException("不支持" + this + "这种操作符");
	}

}
上面的枚举定义了几种基本算法,用起来非常方便:

Operations[] opers = Operations.values();
		for(Operations op : opers){
			double result = op.apply(20, 20);
			System.out.println(op + "< -- > " + result);
		}

然而枚举的功能远远不止于此,下面的枚举虽然没有Switch语句那么简洁,但是非常安全也非常灵活:

public enum PayDay {

	MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY),
	THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), 
	SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);

	private PayType payType;

	PayDay(PayType payType) {
		this.payType = payType;
	}

	public double pay(double hours, double rate) {
		return this.payType.pay(hours, rate);
	}

	private enum PayType {
		WEEKDAY {
			public double overtimePay(double hours, double rate) {
				return hours <= HOURS_PERDAY ? 0 : (hours - HOURS_PERDAY)
						* rate;
			}
		},
		WEEKEND {
			public double overtimePay(double hours, double rate) {
				return hours * rate * 2;
			}

		};
		public double pay(double hours, double rate) { // 计算当天工资
			double baseSalary = hours * rate;
			return baseSalary + this.overtimePay(hours, rate);
		}

		public abstract double overtimePay(double hours, double rate); // 计算加班工资

		private static final int HOURS_PERDAY = 8; // 每天工作时间
	}

}
上面的枚举可以用来计算当天工资,而且可以分为工作日和非工作日还可以计算加班工资。

我的测试代码如下:

 PayDay[] days = PayDay.values();
	      for(PayDay payDay : days){
	    	  System.out.println(payDay + " <---> " + payDay.pay(10, 50));
	      }

枚举不仅仅只有这些,枚举还可以利用接口来扩展:

先定义一个接口 OperationInter:

public interface OperationInter {
   public double apply(double x, double y);
}

下面的枚举是实现了OperationInter接口的枚举:

public enum Operation implements OperationInter {
	PLUS("+") {
		public double apply(double x, double y) {
			return x + y;
		}
	},
	MINUS("-") {
		public double apply(double x, double y) {
			return x - y;
		}
	},
	TIMES("*") {
		public double apply(double x, double y) {
			return x * y;
		}
	},
	DIVIDE("/") {
		public double apply(double x, double y) {
			return x / y;
		}
	};

	Operation(String symbol) {
		this.symbol = symbol;
	}

	@Override
	public String toString() {
		return this.symbol;
	}

	private String symbol;

}

在定义一个实现了Operation接口的枚举:

public enum ExtendOperation implements OperationInter{

	EXP("^"){
		public double apply(double x, double y){
			return Math.pow(x, y);
		}
	},REMAINDER("%"){
		public double apply(double x, double y){
			return x % y;
		}
	};
	
	ExtendOperation(String symbol){
		this.symbol = symbol;
	}
	
	@Override
	public String toString(){
		return this.symbol;
	}
	private String symbol;
}

下面就来试试实现接口对枚举的扩展有什么影响:

public static <T extends Enum<T> & OperationInter> void print(Class<T> opSet,double x,double y){
		for(OperationInter inter : opSet.getEnumConstants()){
			double result = inter.apply(x, y);
			System.out.println(inter + " < -- > " + result);
		}
	}
<T extends Enum<T> & OperationInter> 这个复杂的泛型不仅保证Class既是枚举类型而且也是OperationInter的子类

        print(Operation.class,50,20);
	       print(ExtendOperation.class,50,20);

枚举的功能远远不止于此,我就只列出了这么多了,其他的功能还要继续去试试。

使用枚举也需要注意:

每个枚举都有 oridinal方法,该方法返回每个枚举再类型中的的数字位置,列如:

public enum EnumOridinal {
      FIRST,SECOND,THIRD,FOURTH;
      
      public int position(){
    	  return this.ordinal() + 1;
      }
}

大家千万别这么做,因为这个方法确实可以返回该枚举所在数字位置,但是当往这个枚举或者添加新的枚举再或枚举顺序打乱了,那么position方法返回的值又不同,总的来说,千万别用oridinal方法返回枚举在类型中的数字位置,这么做那么你的后期维护简直就是一场噩梦!






 

JavaSE 拾遗(15)——JavaSE 高新技术基础增强...java5简单新特性和枚举

eclipse开发工具 java5的一些简单新特性 java5的枚举

黑马程序员--Java基础加强(2)-- JDK1.5新特性之可变参数,增强for,自动拆装箱,枚举

JDK1.5新特性之可变参数,增强for,自动拆装箱,枚举 一、 可变参数 1、当一个方法,需要的参数不确定时,可以使用可变参数,比如add方法,希望传入几个参数就让这几个参数相加,声明形式: pub...

Java基础增强---枚举

一、定义枚举的构造函数、方法和字段举例:1、代码:package cn.itcast.enumeration;import org.junit.Test;public class Demo1 { ...

java基础加强(枚举,反射,增强for循环,可变参数,自动拆箱装箱,内省)

一  Eclipse的使用和程序的断点调试 二  eclipse常用快捷键 三  junit测试框架 四  java5的静态导入和自动装箱拆箱 五  增强for循环 六  可变参数 七  什么是枚举类...

Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型

增强for:只适合取数据

枚举java基础知识点

  • 2017年11月03日 12:39
  • 27KB
  • 下载

9.尚硅谷_java基础_枚举&amp;注解

  • 2013年09月05日 15:01
  • 874KB
  • 下载

Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用

在perference 加content Assist 可以设置快捷键 透视图与视图 透视图:Debug和java主窗口 视图:每一个小窗口就是视图 高版本的java可运行低版本的java版本 常见...

JAVA基础-反射-枚举

  • 2016年02月19日 11:59
  • 28KB
  • 下载

java基础-泛型 枚举

一.泛型泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。1.泛型方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。 下面是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java基础&增强 枚举
举报原因:
原因补充:

(最多只允许输入30个字)