类型码,似乎是对于构造成java枚举类似的应用。

来源:互联网 发布:毛笔字在线生成器软件 编辑:程序博客网 时间:2024/05/18 18:21
在使用Replace Type Code with Class 之前,你应该先考虑type code 的其他替换方式。只有当type code 是纯粹数据时(也就是type code 不会在switch 语句中引起行为变化时),你才能以class 来取代它。Java 只能以整数作为switch 语句的「转辙」依据,不能使用任意class ,因此那种情况下不能够以class 替换type code 。做法:为type code 建立一个class 。Ø这个class 内需要一个用以记录type code 的值域,其型别应该和type code 相同;并应该有对应的取值函数(getter)。此外还应该用一组static 变量保存「允许被创建」的实体,并以一个对static 函数根据原本的type code 返回合适的实体。·修改source class 实现码,让它使用上述新建的class 。Ø维持原先以type code 为基础的函数接口,但改变static 值域,以新建的class 产生代码。然后,修改type code 相关函数,让它们也从新建的class 中获取代码。·编译,测试。Ø此时,新建的class 可以对type code 进行运行期检查。·对于source class 中每一个使用type code 的函数,相应建立一个函数,让新函数使用新建的class 。Ø你需要建立「以新class 实体为自变量」的函数,用以替换原先「直接以type code 为引数」的函数。你还需要建立一个「返回新class 实体」的函数,用以替换原先「直接返回type code」的函数。建立新函数前,你可以使用Rename Method 修改原函数名称,明确指出那些函数仍然使用旧式的type code ,这往往是个明智之举。·逐一修改source class 用户,让它们使用新接口。·每修改一个用户,编译并测试。Ø你也可能需要一次性修改多个彼此相关的函数,才能保持这些函数之 间的一致性,才能顺利地编译、测试。·删除「使用type code」的旧接口,并删除「保存旧type code」的静态变量。·编译,测试。例子:每个人都拥有四种血型中的一种。我们以Person 来表示「人」,以其中的type code 表示「血型」:  class Person {    public static final int O = 0;   public static final int A = 1;   public static final int B = 2;   public static final int AB = 3;    private int _bloodGroup;    public Person (int bloodGroup) {       _bloodGroup = bloodGroup;   }    public void setBloodGroup(int arg) {       _bloodGroup = arg;   }    public int getBloodGroup() {       return _bloodGroup;   } }首先,我建立一个新的BloodGroup class,用以表示「血型」,并在这个实体中保存原本的type code 数值:  class BloodGroup {   public static final BloodGroup O = new BloodGroup(0);   public static final BloodGroup A = new BloodGroup(1);   public static final BloodGroup B = new BloodGroup(2);   public static final BloodGroup AB = new BloodGroup(3);   private static final BloodGroup[] _values = {O, A, B, AB};    private final int _code;    private BloodGroup (int code ) {       _code = code;   }    public int getCode() {       return _code;   }    public static BloodGroup code(int arg) {       return _values[arg];   }  }然后,我把Person 中的type code 改为使用BloodGroup class:   class Person {    public static final int O = BloodGroup.O.getCode();   public static final int A = BloodGroup.A.getCode();   public static final int B = BloodGroup.B.getCode();   public static final int AB = BloodGroup.AB.getCode();    private BloodGroup _bloodGroup;    public Person (int bloodGroup) {       _bloodGroup = BloodGroup.code(bloodGroup);   }    public int getBloodGroup() {       return _bloodGroup.getCode();   }    public void setBloodGroup(int arg) {       _bloodGroup = BloodGroup.code (arg);   } }最后两个类变成了:package Chapter1;public class Person {/*public static final int O = BloodGroup.O.getCode();public static final int A = BloodGroup.A.getCode();public static final int B = BloodGroup.B.getCode();public static final int AB = BloodGroup.AB.getCode();*//*public int getBloodGroupCode() {return bloodGroup.getCode();}*//* * public void setBloodGroup(int arg) { this.bloodGroup = * BloodGroup.code(arg); } *  * public Person(int bloodGroup) { this.bloodGroup = * BloodGroup.code(bloodGroup); } */private BloodGroup bloodGroup;public BloodGroup getBloodGroup() {return bloodGroup;}public Person(BloodGroup bloodGroup) {bloodGroup = bloodGroup;}public void setBloodGroup(BloodGroup arg) {bloodGroup = arg;}}package Chapter1;public class BloodGroup {public static final BloodGroup O = new BloodGroup(0);public static final BloodGroup A = new BloodGroup(1);public static final BloodGroup B = new BloodGroup(2);public static final BloodGroup AB = new BloodGroup(3);private static final BloodGroup[] values = {O, A, B, AB};private final int code;private int getCode() {return code;}public BloodGroup(int code) {this.code = code;}private static BloodGroup code(int arg) {return values[arg];}}客户端调用的时候:Person thePerson = new Person(BloodGroup.A);thePerson.getBloodGroup().getCode();thePerson.setBloodGroup(BloodGroup.AB);这样的话有什么好处?似乎是实现了枚举!!!进一步改进的 话,好像可以直接使用枚举!!!