java开发——什么时候使用枚举类型?为什么要用枚举类型?

对于什么时候使用,下面举四个例子:

1、一周有多少天?

7天。像这样固定不变的一组数据,如果我们的程序有需要用到这“7天”的相关信息,例如:发工资分为工作日和周末,可以考虑使用枚举类型。

2、太阳系有多少个行星?

8个。当我们需要计算每个行星的表面重力的时候,像这样我们需要用到固定不变的一组信息中的每一个元素携带了不同的信息,可以考虑使用枚举类型。 

3、计算器中的基础运算符。

 加减乘除。像这样我们需要用到固定不变的一组信息中的每一个元素都决定了不同的行为的时候,可以考虑使用枚举类型。

4、web请求返回的状态。

比如:error为-1,success为0,未登录为-9等可以设为枚举类型。 

样例代码如下:

发工资

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

	private final PayType payType;

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

	double pay(double hoursWorked, double payRate) {
		return payType.pay(hoursWorked, payRate);
	}

	private enum PayType {
		WEEKDAY {
			double overtimePay(double hours, double payRate) {//平时的加班工资
				return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)
						* payRate / 2;
			}
		},
		WEEKEND {
			double overtimePay(double hours, double payRate) {//周末的加班工资
				return hours * payRate / 2;
			}
		};
		private static final int HOURS_PER_SHIFT = 8;

		abstract double overtimePay(double hrs, double payRate);
            
		double pay(double hoursWorked, double payRate) {//计算基本工资+加班工资
			double basePay = hoursWorked * payRate;
			return basePay + overtimePay(hoursWorked, payRate);
		}
	}
}

行星表面重力

public enum Planet {
	MERCURY(3.302e+23, 2.439e6), VENUS(4.869e+24, 6.052e6), 
EARTH(5.975e+24,6.378e6), MARS(6.419e+23, 3.393e6), JUPITER(1.899e+27, 7.149e7), 
SATURN(5.685e+26, 6.027e7), URANUS(8.683e+25, 2.556e7), NEPTUNE(1.024e+26,2.477e7);
	private final double mass; //质量
	private final double radius; //半径
	private final double surfaceGravity; //表面重力

	//引力常数
	private static final double G = 6.67300E-11;

	Planet(double mass, double radius) {
		this.mass = mass;
		this.radius = radius;
		surfaceGravity = G * mass / (radius * radius);
	}

	public double mass() {
		return mass;
	}

	public double radius() {
		return radius;
	}

	public double surfaceGravity() {
		return surfaceGravity;
	}
    //计算一定质量的物体在该星球上的重量。
	public double surfaceWeight(double mass) {
		return mass * surfaceGravity; // F = ma
	}
}

计算机

public enum Operation {
	PLUS("+") {
		double apply(double x, double y) {
			return x + y;
		}
	},
	MINUS("-") {
		double apply(double x, double y) {
			return x - y;
		}
	},
	TIMES("*") {
		double apply(double x, double y) {
			return x * y;
		}
	},
	DIVIDE("/") {
		double apply(double x, double y) {
			return x / y;
		}
	};
	private final String symbol;//标志:+-*/

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

	@Override
	public String toString() {//重写前:PLUS、MINUS、TIMES、DIVIDE
		return symbol;//重写后:+-*/
	}

	abstract double apply(double x, double y);

	//缓存枚举常量
	private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
	static {
		for (Operation op : values())
			stringToEnum.put(op.toString(), op);
	}

	//通过"+-*/"可以获得枚举常量
	public static Operation fromString(String symbol) {
		return stringToEnum.get(symbol);
	}

	public static void main(String[] args) {
		double x = Double.parseDouble(args[0]);
		double y = Double.parseDouble(args[1]);
		for (Operation op : Operation.values())//枚举类型最明显的优点values(),即枚举
			System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
	}
}

状态码:

private enum CodeType {
        ERROR(-1, "失败"),
        SUCCESS(0, "成功");
 
        private int value;
        private String descript;
 
        CodeType(int value, String descript) {
            this.value = value;
            this.descript = descript;
        }
 
        @Override
        public String toString() {
            return this.descript;
        }
}

 

为什么用枚举类型?我想主要有一下两点:

1、使用EnumClass.values(),我们所用的常量可以一一列举出来,即枚举。 

2、每一个常量可以附带信息和行为,封装性好方便使用。

  个人观点:第2条的优势远大于第1条,那为什么不叫常量类型呢?因为有枚举意义的常量第2条才有意义。

 

参考书籍:Effective Java(第2版)

如果对您有用的话赞一下呗!谢谢啦!

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值