Kotlin中如何更简洁设置DateTime?为何apply等函数无效?
问题原因与简洁解决方案
嘿,这个问题的核心其实是你没注意到DateTime(大概率是Joda Time或同类库的实现)是不可变对象!
为什么apply写法没生效?
你用apply作用域函数时,调用hourOfDay().setCopy(hour)这类方法,并不会修改原pickUpDate对象——这类不可变时间类的setCopy方法会返回一个全新的DateTime实例,而你在apply里只是调用了方法,却没有把这个新实例赋值回pickUpDate变量。apply本身最终返回的是原来的对象,所以你的原变量完全没被更新,自然看不到效果。
更简洁的正确写法
既然每个setCopy都会返回新对象,我们可以直接用链式调用一次性完成赋值,比你原来多次赋值的写法简洁多了:
pickUpDate = pickUpDate .hourOfDay().setCopy(10) .minuteOfHour().setCopy(0) .secondOfMinute().setCopy(0)
如果一定要用作用域函数,run也能实现(不过链式写法已经足够直观):
pickUpDate = pickUpDate.run { hourOfDay().setCopy(10) .minuteOfHour().setCopy(0) .secondOfMinute().setCopy(0) }
关键提醒
这类不可变时间类的设计逻辑是:所有修改操作都不会改变原对象,而是生成新实例。所以必须把新实例重新赋值给变量,才能让变量指向更新后的时间——这和Calendar这类可变时间类的操作逻辑完全不同哦!
内容的提问来源于stack exchange,提问作者WinterChilly
相关产品推荐
相关产品推荐

