类型码,似乎是对于构造成java枚举类似的应用。
2011-12-26 16:58
423 查看
在使用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); 这样的话有什么好处?似乎是实现了枚举!!! 进一步改进的 话,好像可以直接使用枚举!!!
相关文章推荐
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- java之枚举类型应用
- java语言基础(33)——面向对象(父类中没有无参构造编译报错——无法将类 xxx中的构造器 xxx应用到给定类型 实际参数列表和形式参数列表长度不同)
- Java 数据类型在实际开发中应用二枚举
- Effective Java之对于实例控制,枚举类型优于readResolve(七十七)
- Java的枚举类型应用
- MyBatis对于Java对象里的枚举类型处理
- MyBatis对于Java对象里的枚举类型处理
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 加强eclipse的使用技巧。可变参数。基本数据类型自动装箱和拆箱。枚举。反射。数组反射的应用。ArrayList和HashSet。JavaBean
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- java类型安全枚举与反射机制相结合的应用 作者:封宇
- Java 数据类型在实际开发中应用二枚举
- 总算知道java的列表为何要设一个专用的枚举类型Iterator了
- Java枚举应用方法
- Java-枚举应用总结
- Java 枚举类型知识点
- java基础之枚举类型
- java程序应用编写如何判断文本框里面的数据类型