JavaExplore

一切像雾像雨又像风
posts - 19, comments - 45, trackbacks - 0, articles - 0

代码中经常会出现枚举性的变量,比如血型、性别之类。
以血型为例:

class Blood {
public final static 
int  o = 0 ;
public final static 
int  A = 1 ;
public final static 
int  B = 2 ;
public final static 
int  AB = 3 ;

private Blood();
}



class person
{
private 
int  _blood;
public 
void  setBlood( int  b) {
   _blood
= b;
}

如果要给一个person的实例设置血型,代码如此:person.setBlood(Blood.A);
这个写法的代码中,setBlood的参数为整型,如果如此调用person.setBlood(9);
编译器无法发现错误,只能靠人为控制,如果在方法setBlood中检测参数的有效性,又超越了该方法的职责。

重构后的代码如下:

final class Blood{
public final static Blood O
=new Blood(0);
public final static Blood A
=new Blood(1);
public final static Blood B
=new Blood(2);
public final static Blood AB
=new Blood(3);
private 
int _bloodCode;
private Blood(
int b){
    _bloodCode
=b;
  }

public 
int getCode(){
    
return _bloodCode;
  }

}


class person
{
private Blood _blood;
public setBlood(Blood b)
{
    _blood
=b;
  }

}

如此,(1)隐藏了血型的编码细节
            (2)方便编译期间发现错误
            (3)避免使用超越数据范围的参数

Feedback

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-19 09:26 by fanta
规范的编程是不允许出现person.setBlood(9);这样的代码的,不能直接将数字常量直接放在代码里的

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-19 09:31 by JavaExplore
那就public final static int H=9;
person.setBlood(H);

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-19 13:30 by usherlight
Java没有Enum吗?

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-19 14:59 by TiGERTiAN
好像tiger里面新增了Enum..

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-19 15:18 by ^ Mustang ^
tiger李已经有enumeration了,不用多此一举了

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-20 13:33 by ^ Mustang ^
你有没有看过Tiger中enum的实现?你以为enum仅仅是一个面向过程的数据结构?Tiger中的enum是纯面向对象的,里面封装了很多方法,只不过你使用的时候觉察不到而已。

# re: 神奇的重构技术(《重构》读书笔记 一)  回复  更多评论   

2005-09-20 13:36 by JavaExplore
en 我觉得这种方法完全面向对象 是一种很不错的设计
没有使用过Tiger中的enum,有机会一定看看

只有注册用户登录后才能发表评论。


网站导航: