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. Pipeline组Alpha版本发布说明

    Pipeline组Alpha版本发布说明 项目名称 Pipeline 项目版本 Alpha版本 负责人 北京航空航天大学计算机学院 ILoveSE 联系方式 http://www.cnblogs.co ...

  2. JavaScript初探系列之基本概念

    JavaScript的核心语言特性在ECMA-262中是以名为ECMAScript(ECMA, EuropeanComputer Manufacturers Association )的伪语言的形式来 ...

  3. js实现倒计时60秒的简单代码

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  4. <T extends Comparable<? super T>>

    在看Collections源代码中,看到如下代码: public static <T extends Comparable<? super T>> void sort(List ...

  5. java 基本--数据类型转换--001

    小可转大,大转小可能会损失精度(编译出错,需要强制转换)A: byte,short,char -> int -> long -> float ->doubleB: byte,s ...

  6. windows网络模型

    Windows提供了四种异步IO技术,机制几乎时相同的,区别在于通知结果的方式不同: 1.通过注册的消息函数进行通知 2.通过内核event事件进行通知 3.通过称为完成例程的回调函数进行通知 4.通 ...

  7. Extensions disabled by Chrome

    Extensions disabled by Chrome https://support.google.com/chrome_webstore/answer/2811969 https://supp ...

  8. Xcode开发技巧之code snippets(代码片段)

    一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...

  9. Java序列简单使用

    package javatest; import java.io.*; public class SerializableTest implements Serializable { public s ...

  10. FreeBSD查看网络情况

    FreeBSD查看网络情况 记录一下FreeBSD下常用的统计当前系统网络连接状态的一些命令: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc - ...