天天看点

敲代码的时候你可能忽略的一些小细节(篇一)

仅写给自己看看吧,以后在敲代码的时候注意一些!

列举一些语法、逻辑在使用的时候可能忽略的小细节!虽然不太实用,这些问题在报错的时候Debug都能发现,当然为了提高效率,使用BeanUtils.copyProperties的时候还是有这个意识吧!

1.BeanUtils.copyProperties(aDom,bDom);

  • 如果有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm。例如:一个用户注册页面,有一个User实体类和一个UserActionForm,我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

例如:A表示含有属性,a表示不含有!

属性 name age sex high weight tennis bsket
aDom A A A A A a a
bDom A A A A A A A
  • 问题:假设我们要将aDom的属性对应传到bDom里面去

传统方法:

//向bDom中设置aDom中含有的属性
    
      bDom.setName(aDom.getName);
      
      bDom.setAge(aDom.getAge);
      
      bDom.setSex(aDom.getSex);
      
      bDom.setHigh(aDom.getHigh); 
      
      bDom.setWeight(aDom.getWeight);
      
      bDom.setName(aDom.getName);
      
           

简便方法:

//向bDom中设置aDom中含有的属性
    
    BeanUtils.copyProperties(aDom,bDom);
    
           
  • 如果使用传统的方法,Bean里面的属性太多的话,那就变得不现实了,所以BeansUtil.copyProperties简化了很多,一条代码便搞定!

容易遗漏的小细节来了:

  • 1、很多时候我们在拷贝了属性以后容易忘记单独设置剩下两个属性!

    所以在以上代码完成的时候,需要单独添加属性!

    处理方法:

BeanUtils.copyProperties(aDom,bDom);
  
  bDom.setTennis("网球");
  
  bBom.setBsket("篮球");
           
  • 2、假如我们的两个类是数据传输类,两个都拥有相同的属性,但有着不同的初始值!如下
属性 name age sex high weight tennis bsket
aDom aa 12 178 58 Null Null
bDom Null Null Null Null Null Null Null

在表中tennis和bsket都是没有值的!需要我们单独赋值,在克服第一个疏忽之后我们还可能疏忽的是代码顺序!

bDom.setTennis("网球");
  
  bBom.setBsket("篮球");
  
  BeanUtils.copyProperties(aDom,bDom);
  
           
  • 当我们使用上面代码的时候,最后你会发现你赋的值变为了Null ,为什么呢?其实细细理一下思路就能发现!我们使用BeanUtils.copyProperties复制属性的时候aDom的Null值将你set的值给覆盖了!
  • 处理方法也很简单:
//只需要调整一下代码顺序即可,先copy再赋值,就不会被覆盖了!
   
    BeanUtils.copyProperties(aDom,bDom);
  
    bDom.setTennis("网球");
  
    bDom.setBsket("篮球");
           
  • 3、还有一种容易忽略的情况,和第二种差不多!两者属性默认值如下:
属性 name age sex high weight tennis bsket
aDom aa Null Null 58 Null Null
bDom Null 18 Null 185l Null Null Null

在避免1、2两种疏忽之后,第三种其实也很简单,两者默认属性有交叉的!在将aDom的属性copy到bDom的时候,aDom其本身的Null属性会覆盖掉bDom已有的属性!这个时候如果采用BeanUtils.copyProperties复制属性的时候,age和high不可避免需要单独set赋值。

解决方法:

BeanUtils.copyProperties(aDom,bDom);
  
    bDom.setAge("18");
  
    bDom.setHigh("185");
  
    bDom.setTennis("网球");
  
    bDom.setBsket("篮球");
           

综上所述,如果使用BeanUtils.copyProperties,有需要单独赋值的属性尽量放在copy语句的后面,防止copy的时候被覆盖掉!当然使用BeanUtils.copyProperties只能拷贝属性名字相同的属性,如果对应的属性名称不一样的话就需要我们自定义converter对象转换工具类了!

声明:本文为作者学习心得,养成记录学习的好习惯吧!如有错误,望指正,谢谢!