java给文本赋值_一个解析文本中的信息并向对象赋值过程的思考.

首先解释一下,文本中的信息指的是 对象在文本文件中的描述,如"名称:Bill 职位:SSE 年龄:45  薪水:10000"这个形式的.要求把这样的信息转换到对象Member中,对录入出错的情况如年龄薪水有非数字字符需要加以鉴别.

对象基本信息如下:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassMemberimplementsComparable9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//名称d18c02628675d0a2c816449d98bda930.pngprivateString name;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//年龄d18c02628675d0a2c816449d98bda930.pngprivateintage;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//职位d18c02628675d0a2c816449d98bda930.pngprivateString title;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//薪水d18c02628675d0a2c816449d98bda930.pngprivateintsalary;

d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.png    

9b8a8a44dd1c74ae49c20a7cd451974e.png.    

d18c02628675d0a2c816449d98bda930.png    

8f1ba5b45633e9678d1db480c16cae3f.png}

从这段字符串中找到相关的信息并设置到Member对象的相关属性中并不难,但有几个地方需要多加考虑:

1.名称职位薪水年龄的顺序不一定一致.

2.职位薪水年龄三个字段和值有可能没有.

3.有可能需要增加字段,此时类也需要修改.

处理程序需要考虑解析,验证,赋值三个环节,如果耦合在一起处理当然也能做出来,但这样做可读性和可维护性都不好,也背离了面向对象的初衷.好的方案应该把这三部分分开制作函数处理.

文本解析部分:我的想法是首先将"名称:Bill 职位:SSE 年龄:45  薪水:10000"以空格劈分成包含这样元素的链表:

名称:Bill

职位:SSE

年龄:45

薪水:10000

然后在用冒号":"劈分单个元素,前半部分作为键,后半部分作为值,放入一个Hashtable中:

key    value

名称 Bill

职位 SSE

年龄 45

薪水 10000

解析部分代码如下:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 将分段字符串链表转化成成员链表,不成功者记入错误链表

d18c02628675d0a2c816449d98bda930.png     * 

d18c02628675d0a2c816449d98bda930.png     *@paramsegmentList

d18c02628675d0a2c816449d98bda930.png     *            分段字符串链表

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifprivatevoidchangeSegmentToMember(ListsegmentList)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String segment : segmentList)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            Mapht=StringUtil.parseStr2Map(segment,"",":");

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png            Member member=newMember();

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(member.setHtToProperties(ht))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//成功赋值,将成员放入成员列表d18c02628675d0a2c816449d98bda930.pngmemberList.add(member);

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            }else9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//有任何错误,将分段信息放入错误链表d18c02628675d0a2c816449d98bda930.pngerrorList.add(segment);

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        }8f1ba5b45633e9678d1db480c16cae3f.png    }

赋值和验证部分:

然后把这个Hashtable传入到Member的一个函数setHtToProperties中,这个函数的任务是对Hashtable中的键值对进行遍历,在调用函数setValueToProperty对字段进行赋值:

代码如下:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 将哈息表中成对的值按规则输入属性

d18c02628675d0a2c816449d98bda930.png     *@paramht

d18c02628675d0a2c816449d98bda930.png     *@return8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicbooleansetHtToProperties(Mapht)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        Iterator it=ht.keySet().iterator();

d18c02628675d0a2c816449d98bda930.png        

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifwhile(it.hasNext())9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            String key=(String)it.next();

d18c02628675d0a2c816449d98bda930.png            String value=(String)ht.get(key);

d18c02628675d0a2c816449d98bda930.png            

d18c02628675d0a2c816449d98bda930.pngbooleanisSettted=setValueToProperty(key,value);

d18c02628675d0a2c816449d98bda930.png            

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(isSettted==false)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnfalse;

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.pngreturntrue;

8f1ba5b45633e9678d1db480c16cae3f.png    }4f1150b881333f12a311ae9ef34da474.png    

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 在mapping关系中用属性名去找属性对应的变量,是则赋值;如找不到或转化出错则返回假

d18c02628675d0a2c816449d98bda930.png     *@parampropertyName 属性名,如name对应的名称

d18c02628675d0a2c816449d98bda930.png     *@parampropertyNalue 属性值,如那么对应的Bill

d18c02628675d0a2c816449d98bda930.png     *@return8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifprivatebooleansetValueToProperty(String propertyName,String propertyNalue)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(propertyName.equals("名称"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            name=propertyNalue;

ecedf933ec37d714bd4c2545da43add2.png        }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelseif(propertyName.equals("年龄"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngintageTemp=Integer.parseInt(propertyNalue);

d18c02628675d0a2c816449d98bda930.png                age=ageTemp;

ecedf933ec37d714bd4c2545da43add2.png            }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifcatch(Exception e)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnfalse;

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelseif(propertyName.equals("职位"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            title=propertyNalue;

ecedf933ec37d714bd4c2545da43add2.png        }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelseif(propertyName.equals("薪水"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngintsalaryTemp=Integer.parseInt(propertyNalue);

d18c02628675d0a2c816449d98bda930.png                salary=salaryTemp;

ecedf933ec37d714bd4c2545da43add2.png            }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifcatch(Exception e)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnfalse;

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelse9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngreturnfalse;

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngreturntrue;

8f1ba5b45633e9678d1db480c16cae3f.png    }

建立setValueToProperty函数的初衷是,用分支语句建立起键值与字段的对应关系,对应上了则进行赋值,这和Mapping有点类似,有些转化和验证工作也在分支内进行,只要验证出现问题即退出处理.

这样的处理方法带来了如下好处:

1.外界的类只需要解析文本,不需也不应该知道如何向Member的对应字段赋值,这个工作应该由Member自己进行,setHtToProperties函数帮助达成了这一点,有效降低了Member和其它类的耦合程度.

2.即使职位薪水年龄三个字段和值缺失,也不影响其它字段的赋值过程.

3.如果增加字段,setValueToProperty函数中只需要增加一个Mapping分支即可,其它地方无须改动.

4.对数据的校验工作可以统一在setValueToProperty函数中完成.

进行了如此处理后,代码量也不见得比混合处理多多少,而程序更加清晰,适应性也增强了,经得起不断更改. 比解析验证赋值混合在一起的方案要强的多.

完整代码下载:

http://www.blogjava.net/Files/sitinspring/MemberProcessor20071207163615.rar

posted on 2008-02-22 10:28 和风细雨 阅读(112) 评论(0)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值