1.用枚举类型替代int枚举类型和string枚举类型
public class Show {
// Int枚举类型
// public static final int APPLE_FUJI = 0;
// public static final int APPLE_PIPPIN = 1;
// public static final int APPLE_GRANNY_SMITH = 2;
public enum Apple {
FUJI, PIPPIN, GRANNY_SMITH
}
public enum Orange {
FUJI, PIPPIN, GRANNY_SMITH
}
}
2.一个枚举类型可以和行为相关联,枚举类型可包含行为
比如下述,Planet它包含了行为:mass(),radius(),surfaceGravity(),
surfaceWeight( double mass)。当常量具有对应的行为的时候,就可以通过下述方式来实现,在枚举类型中定义行为。
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 ; // In kilograms
private final double radius ; // In meters
private final double surfaceGravity ; // In m / s^2
// Universal gravitational constant in m^3 / kg s^2
private static final double G = 6.67300E-11;
// Constructor
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 class WeightTable {
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
System. out.printf("Weight on %s is %f%n" , p, p.surfaceWeight(mass));
}
}
Planet枚举类型,有9个枚举常量。每个枚举常量,通过构造器实例化。每个枚举常量有相同的行为。
3.枚举和行为关联,定义特定于某个枚举常量的行为
如下,下述有4个枚举常量。每个枚举常量有特定的行为,每个枚举常量对apply行为有自己的实现,而不是像上述2中的,所有枚举常量共用相同的实现。
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);
// Implementing a fromString method on an enum type - Page 154
private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
}
// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum .get(symbol);
}
// Test program to perform all operations on given operands
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System. out.printf("%f %s %f = %f%n" , x, op, y, op.apply(x, y));
Operation plus = Operation. PLUS;
System. out .printf("12 %s 13 = %f%n" , "plus" , plus.apply(12, 13));
}
}
分析:枚举常量,PLUS,MINUS,TIMES,DIVIDE,这三个是枚举类型Operation的final实例。为了将某个具体的final实例跟特定的方法关联起来,可以这样做:首先,在Operation类中,声明抽象方法apply;然后,每个具体的final实例,实现自己的apply方法。这样,就实现了,具体的枚举常量跟一个具体的方法关联。
4.用枚举类型实现策略模式
策略模式,就是,客户端指定了一个策略,然后,代码就按照该策略执行。客户端可以切换策略,从而让代码按照不同的逻辑执行。
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 hoursWorked, double payRate) {
return payType.pay(hoursWorked, payRate);
}
// The strategy enum type
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);
}
}
}
当指定不同的枚举常量的时候,会执行不同的加班策略。每个具体的枚举常量,它对应的加班策略,在声明的时候就确定了。
比如,枚举常量MONDAY,当访问pay方法时,它执行的是PayType枚举类型中的加班计算策略。
- 枚举Enum通过int值或文本转为对应的枚举类型
1.数值转枚举 如果枚举类型继承了数值类型,可以直接强制转换 public enum SourceType : byte { YC = , TS = , QK = , ZQ = } //转换方式 ; ...
- Java的Integer常量池和String常量池
1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...
- mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))
6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...
- 第30条:用enum代替int常量
在java1.5之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量: public static final int APPLE_FUJI = 0; public stati ...
- 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...
- C# enum、int、string三种类型互相转换
enum.int.string三种类型之间的互转 #代码: public enum Sex { Man=, Woman= } public static void enumConvert() { in ...
- Enum,int,string类型互转
举例:enum Colors { Red, Green, Blue, Yellow }; Enum-->String (1)利用Object.ToString()方法:如Colors.Green ...
- Java开发笔记(五十六)利用枚举类型实现高级常量
前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...
- 【转】const int *p和int * const p的区别(常量指针与指向常量的指针)
[转]作者:xwdreamer 出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...
随机推荐
- c#事件实质
c#的事件实际上是对windows消息的封装: windows消息系统分为3部分:消息队列,消息循环,窗口过程(wndproc函数)
- c#程序的config文件问题
1.vshost.exe.config和app.config两个文件可不要,但exe.config文件不可少. 2.但是app.config最好也要修改了,每次重新生成程序的时候.exe.cmonfi ...
- Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
- PART1 一些想法
其实我一直是一个后知后觉的人,这点也是我过了好久才发现的问题,之所以晚发现自己这个毛病,是因为后知后觉==,这有点像是个悖论或者是笑话,但的确是真实存在于我的身上.其实当初为啥来这个学校选计算机的专业 ...
- 在mysql启用远程连接
1.在ubuntu下面安装mysql. apt-get install mysql-server mysql-client -y 2.修改/etc/mysql/my.cnf文件. #bind-addr ...
- 《学习OpenCV》课后习题解答6
题目:(P104) 使用cvCmp()创建一个掩码.加载一个真实的图像.使用cvsplit()将图像分割成红,绿,蓝三个单通道图像. a.找到并显示绿图. b.克隆这个绿图两次(分别命名为clone1 ...
- 【Linux】- vi/vim
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...
- CentOS修改DNS、IP地址、网关
一.CentOS 修改DNS 修改对应网卡的DNS的配置文件 # vi /etc/resolv.conf 修改以下内容 nameserver 8.8.8.8 #google域名服务器 nameserv ...
- phpcms 模型
- AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.
把Androidstudio2.2的项目放到3.0里面去了,然后开始报错了. 体验最新版AndroidStudio3.0 Canary 8的时候,发现之前项目的butter knife报错,用到注解的 ...