005-容易踩的坑

1.区分Integer.getInteger和Integer.valueOf使用方法

总结:
    
    1.Integer.getInteger(s)  获取的是名为 s 的系统属性
    2.Integer.valueOf(s)    获取的是 s 对应的整数

Integer类有两个看起来很类似的静态方法,一个是Integer.getInteger(String),另外一个是Integer.valueOf(String)。如果只看方法名称的话,很容易将这两个方法的功能区分开来,还是让我们来看看Java文档。

Integer.getInteger(String)的功能是根据指定的名称得到系统属性的整数值。 第一个参数将被认为是系统属性的名称。系统属性可以通过 System.getProperty(java.lang.String)方法访问得到。属性值字符串将被解释成一个整数,并且以表示这个值的Integer对象形式返回。可能出现的数字格式的详细说明可以在 getProperty 的定义说明里找到。

Integer.valueOf(String)的功能是获取给定的字符串所代表的整数。

那么就让我来看看是否理解了:
Integer.valueOf(String)方法假设String参数表达的是一个数值,会把该数值String转化成Integer。也就是说, Integer.valueOf("123") 得到一个Integer对象,其值是123Integer.getInteger(String)方法假设String参数是一个系统属性数值的名称,会读取该系统属性,然后把系统属性的值转换成一个数字。也就是说, Integer.getInteger("12345") 应该是得到 null(假设没有名为12345的系统属性)。

虽然这两个方法的功能是不一样的,但是从方法的名称上并没有明显的区分开来,常常容易让人混淆。有很多bug就是因为想使用valueOf的功能但是错误的使用了getInteger方法而导致的。

这是在Java语言中会产生歧义的一个糟糕的例子。另外一个糟糕的例子是Boolean.getBoolean("true")Boolean.getBoolean(String)的功能和Integer.getInteger(String)是类似的。通常我们都不会有一个名为“true”的系统属性,因此Boolean.getBoolean("true")通常会返回Boolean.FALSE。这里甚至比Integer.getInteger(String)还要糟糕,还不如返回一个null更容易让人发现错误。
    

2.BigDecimal累加无效问题

2.1 错误写法:

 //订单金额
 BigDecimal orderAmount = new BigDecimal(0);
  for (Object o : dayPriceDtos) {
      JSONObject obj = JSONObject.parseObject(o.toString());
      //每日房价累加
      orderAmount.add(obj.getBigDecimal("roomPrice"));
  }

2.2:问题:
这样累加会导致orderAmount的值为0,累计无效
2.3.正确写法:

 //订单金额
 BigDecimal orderAmount = new BigDecimal(0);
  for (Object o : dayPriceDtos) {
      JSONObject obj = JSONObject.parseObject(o.toString());
      //每日房价累加
      orderAmount = orderAmount.add(obj.getBigDecimal("roomPrice"));
  }

2.4.原理:
==据说是因为 ==bigDecimal作为参数传入一个方法中,比如add(),累加之后返回的是一个新的对象,跟方法外部定义的BigDecimal对象不是同一个。重新赋值,覆盖掉就好了。

3.事务与锁的联合使用

3.1.需求前提
需要同一个时间只能有一个线程在执行任务,且任务处在事务内
3.2.使用过程
服务实现类的方法先加锁

@Override
public synchronized Boolean createCouponAssignRecord(BgateCouponAssignRecordBatchCreateVo batchCreateVo) {
    return createCouponAssignRecordHandle(batchCreateVo);
}

3.3.然后把具体实现放在公共的另一个方法并开启事务
@Transactional
public Boolean createCouponAssignRecordHandle(BgateCouponAssignRecordBatchCreateVo batchCreateVo) {

}
3.4.注意事项

  • 事务和锁不能同时加在一个方法上,必须分开,先加锁后开启事务
  • 否则会出现事务没跑完,锁已经被释放,导致锁无效
  • 必须保证事务在锁内部,事务跑完了才能释放锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值