关于枚举类型的一些总结
2017-11-13 14:41
218 查看
关于枚举类型的一些总结
1.枚举是由一组固定的常量组成合法值的类型2.枚举是通过公有的静态final域为每个枚举常量导出实例的类。因为没有可以访问的构造函数,枚举类型是真正的final。因为客户端既不能创建枚举类型的实例,又不能对它进行扩展,因此很可能没有实例,只有声明过的枚举常量。换句话说,枚举类型是实例受控的,它们是单例的泛型化。枚举类型为类型安全的枚举。
3.枚举提供了编译时的线程安全。
4.为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并 将数据保存在域中的构造器。枚举天生就是不可变的,因此所有的域都应该为final,它们可以是公有的,但最好将它们做成私有的,并提供公有的访问方法。
5.将不同的行为与每个枚举常量关联起来:在枚举类型中声明一个抽象的apply方法,并在特定与常量的类主体中,用具体的方法覆盖每个常量的抽象apply方法,这种方法被称作特定于常量的方法实现。
public enum Operation { PLUS("+") { @Override double apply(double x, int y) { return x+y; } }, MINUX("-") { @Override double apply(double x, int y) { return x-y; } }, TIMES("*") { @Override double apply(double x, int y) { return x*y; } }, DIVIDE("/") { @Override double apply(double x, int y) { return x/y; } }; private final String symbol; private Operation(String symbol) { this.symbol = symbol; } abstract double apply(double x, int y); private static final Map<String, Operation> stringToEnum = new HashMap<String,Operation>(); static { for (Operation op : Operation.values()) { stringToEnum.put(op.toString(), op); } } public static Operation fromString(String symbol) { return stringToEnum.get(symbol); } @Override public String toString() { return symbol; } } 调用如下: for (Operation operation : Operation.values()) { System.out.println(operation.apply(2,3)); }
6.下面是一个策略枚举的例子,内有私有的嵌套枚举,用于计算不同星期的工资。
public 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 hoursWeeked, double payRate) { return payType.pay(hoursWeeked, payRate); } private enum PayType { WEEKDAY { @Override double overtimePay(double hrs, double payRate) { return hrs <= HOURS_PER_SHIFT ? 0 : (hrs - HOURS_PER_SHIFT) * payRate / 2; } }, WEEKEND { @Override double overtimePay(double hrs, double payRate) { return hrs * 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); } } } 使用如下: System.out.println(PayrollDay.MONDAY.pay(23, 0.56)); System.out.println(PayrollDay.SATURDAY.pay(23, 0.56));
相关文章推荐
- 关于structs中文处理的一些小总结
- 关于线程问题的一些总结
- 关于C++异常处理的一些总结
- 关于MySQL的Myisam和Innodb的一些比较总结
- 关于LINK2001错误的一些总结(转)
- 枚举类型的一些用法总结
- 关于终端的一些总结
- 关于消息的一些总结
- 关于JS和浏览器的一些总结
- 关于Storm的一些总结
- 关于JS定时器的一些总结
- 关于java 单元测试Junit4和Mock的一些总结
- 一些关于angular的总结
- 关于ASP.NET在IIS一些问题的经验总结(zz)
- 关于LNK2001错误的一些总结 ---ZT
- 关于c++的虚函数的一些总结
- 【转】关于用户体验的一些总结
- 关于Web打印的一些总结
- 关于工作流(Workflow Foundation)的一些总结归纳
- 关于编写Makefile的一些总结