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. javaIO--字节流

    流---是指的一组有序的.有气垫和重点的字节集合,是对的护具传输的总称或者抽象. 流采用缓冲区技术,当写一个数据时,系统将数据发送到缓冲区而不是外部设备(如硬盘),当读一个数据时,系统实际是从缓冲区读 ...

  2. 【alpha】Scrum站立会议第3次....10.18

    小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app(约吧--暂定) 1.任务进度 2.燃尽图 功能列表 1.登录注册 2.创建跑步计划 3.筛选跑友 4.加一起跑步的人为好 ...

  3. Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法

    相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...

  4. matlab中的静态变量

    persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...

  5. 自学网络 arp_ignore/arp_announce

    1)机器上有好几个IP地址,如何让网卡只接收自己IP地址的数据包: 如何只接收自己网卡的数据包 http://www.cnblogs.com/honpey/p/8447819.html 相关的配置ar ...

  6. Properties 的list方法 直接将内容放到文本中

    Properties 的list方法 直接将内容放到文本中

  7. 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度

    原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...

  8. 2018牛客多校第六场 I.Team Rocket

    题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...

  9. [SDOI2015]约数个数和 莫比乌斯反演

    ---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...

  10. POJ3090:Visible Lattice Points——题解

    http://poj.org/problem?id=3090 题目大意:你站在(0,0)的点上看向第一向限的点,点和点会互相阻挡,问最多看到多少点. 很容易想到,我们能看到的点,它的横纵坐标一定是互质 ...