今天第一天看<<Effective Java>>,看了第六章的第一条就是全书的第30条--用enum代替int常量。
1.第一次知道原来enum也可以像class那样拥有成员函数。举个四则运算的例子:
package com.wjy.test; public enum Operation { PLUS,MINUS,TIMES,DIVIDE; double apply(double x,double y){ switch(this){ case PLUS: return x+y; case MINUS: return x-y; case TIMES: return x*y; case DIVIDE: return x/y; } throw new AssertionError("Unknown op: "+this); } }
调用代码:
package com.wjy.test; public class Test { public static void main(String args[]){ System.out.println(Operation.PLUS.apply(1.0,2.2)); } }
但是上述方式有一个问题,就是不利于扩展。若添加一个新的枚举常量还要更改switch添加一条语句,所以这种模式是很脆弱的。
有一种好的模式可以将不同的行为与每个枚举常量关联起来。
2.将不同的行为与每个枚举常量关联的办法:
package com.wjy.test; 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;} }; abstract double apply(double x,double y); }
调用代码
package com.wjy.test; public class Test { public static void main(String args[]){ System.out.println(Operation.PLUS); System.out.println(Operation.PLUS.apply(1.0,2.2)); } }
运行结果:
//结果 PLUS 3.2
问题又出现了,为什么输出的是"PLUS"而不是”+“,为了让他输出"+",应该覆盖toString方法。
3.重载toString()
package com.wjy.test; 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(){ return symbol; } abstract double apply(double x,double y); }
则Option.PLUS和"+"关联起来了。