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 {
    FUJIPIPPINGRANNY_SMITH
  }
 
  public enum Orange {
    FUJIPIPPINGRANNY_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枚举类型中的加班计算策略。
 
 

Item 30 用enum代替int常量类型枚举,string常量类型枚举的更多相关文章

  1. 枚举Enum通过int值或文本转为对应的枚举类型

    1.数值转枚举 如果枚举类型继承了数值类型,可以直接强制转换 public enum SourceType : byte { YC = , TS = , QK = , ZQ = } //转换方式 ; ...

  2. Java的Integer常量池和String常量池

    1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...

  3. mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))

    6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...

  4. 第30条:用enum代替int常量

    在java1.5之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量: public static final int APPLE_FUJI = 0; public stati ...

  5. 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...

  6. C# enum、int、string三种类型互相转换

    enum.int.string三种类型之间的互转 #代码: public enum Sex { Man=, Woman= } public static void enumConvert() { in ...

  7. Enum,int,string类型互转

    举例:enum Colors { Red, Green, Blue, Yellow }; Enum-->String (1)利用Object.ToString()方法:如Colors.Green ...

  8. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  9. 【转】const int *p和int * const p的区别(常量指针与指向常量的指针)

    [转]作者:xwdreamer   出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...

随机推荐

  1. c#事件实质

    c#的事件实际上是对windows消息的封装: windows消息系统分为3部分:消息队列,消息循环,窗口过程(wndproc函数)

  2. c#程序的config文件问题

    1.vshost.exe.config和app.config两个文件可不要,但exe.config文件不可少. 2.但是app.config最好也要修改了,每次重新生成程序的时候.exe.cmonfi ...

  3. Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  4. PART1 一些想法

    其实我一直是一个后知后觉的人,这点也是我过了好久才发现的问题,之所以晚发现自己这个毛病,是因为后知后觉==,这有点像是个悖论或者是笑话,但的确是真实存在于我的身上.其实当初为啥来这个学校选计算机的专业 ...

  5. 在mysql启用远程连接

    1.在ubuntu下面安装mysql. apt-get install mysql-server mysql-client -y 2.修改/etc/mysql/my.cnf文件. #bind-addr ...

  6. 《学习OpenCV》课后习题解答6

    题目:(P104) 使用cvCmp()创建一个掩码.加载一个真实的图像.使用cvsplit()将图像分割成红,绿,蓝三个单通道图像. a.找到并显示绿图. b.克隆这个绿图两次(分别命名为clone1 ...

  7. 【Linux】- vi/vim

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  8. CentOS修改DNS、IP地址、网关

    一.CentOS 修改DNS 修改对应网卡的DNS的配置文件 # vi /etc/resolv.conf 修改以下内容 nameserver 8.8.8.8 #google域名服务器 nameserv ...

  9. phpcms 模型

  10. 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报错,用到注解的 ...