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

在使用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);

这样的话有什么好处?似乎是实现了枚举!!!
进一步改进的 话,好像可以直接使用枚举!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值