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方法返回枚举在类型中的数字位置,这么做那么你的后期维护简直就是一场噩梦!






 

java增强_枚举的总结

---------------------- android培训、java培训、期待与您交流!  1、为什么要有枚举 1)问题:要定义星期几或者性别的变量,该怎么定义?假设用1-7分别...
  • zsw101259
  • zsw101259
  • 2013年05月23日 23:14
  • 521

Java基础增强---枚举

一、定义枚举的构造函数、方法和字段举例:1、代码:package cn.itcast.enumeration;import org.junit.Test;public class Demo1 { ...
  • clpig0125
  • clpig0125
  • 2016年08月16日 08:51
  • 409

java基础增强之其他小知识

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 1.静态导入 概念:当我们想调用...
  • zhoulenihao
  • zhoulenihao
  • 2013年09月10日 13:36
  • 1243

传智播客-Java基础加强-day5

注解:也是jdk1.5的一个新特性,是一种标记,一种说明,可以在包,类,方法,参数,成员变量等对象或成员之前,javac编译器,开发工具和其它程序可以用反射来了解类及各种元素上是否有某种标记,不同的标...
  • aasspp1100
  • aasspp1100
  • 2011年01月13日 23:19
  • 296

Java基础:基础加强

Java enhance
  • zr523725410
  • zr523725410
  • 2014年09月26日 00:24
  • 2309

黑马程序员-张孝祥Java基础加强(PART1)

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 知识点: 1.Java5的几个新特性,...
  • niniliwei
  • niniliwei
  • 2014年02月28日 15:30
  • 1079

枚举 基础增强篇

为什么需要枚举 一些方法在运行时,他需要的数据不能是任意的,而必须是一定范围内的值,java5以后可以直接使用枚举予以解决。 JDK5新增的enum关键字用于定义一个枚举类 枚举类是...
  • qq_37248648
  • qq_37248648
  • 2017年07月10日 01:41
  • 72

C#基础枚举类型

12.1    枚举类型 枚举类型基实就是一些常量和一个实例字段。 强类型,枚举之间进行不能隐式转换 枚举类型直接派生于System.Enum,后者派生于System.ValueTy...
  • Root915
  • Root915
  • 2017年04月27日 18:45
  • 397

java 基础总结 -- enum 枚举的基础使用

package com.zghw.base.enumx; /** * 枚举类型定义 * @author zghw * */ //使用enum关键字定义一个枚举 public enum Spi...
  • zghwaicsdn
  • zghwaicsdn
  • 2016年02月10日 04:03
  • 916

Java基础增强2-枚举,可变参数

1、可变参数: 测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。 可变参数实例: public class Demo1 { publi...
  • danny1991
  • danny1991
  • 2015年10月22日 10:08
  • 178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java基础&增强 枚举
举报原因:
原因补充:

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