如何在Kotlin中为LocalTime类型设置可选参数与默认值?
解决LocalTime可选参数的null处理与默认值问题
首先,针对你遇到的问题,核心是利用Kotlin的可空类型(nullable)和空安全操作来处理LocalTime的可选参数,同时避免使用固定默认值(比如"00:00:00")。下面一步步给你梳理解决方案:
1. 给data class的可选参数设置默认值为null
既然不能用固定的LocalTime值作为默认,最合理的默认值就是null——它代表“该时段不存在”,完全符合你“针对每个日期设置”的需求。修改你的OpeningHours定义:
data class OpeningHours( var startServiceHours: LocalTime, var finalServiceHours: LocalTime, // 给可选的不便时段参数设置默认null var inconvenienceStartTime: LocalTime? = null, var inconvenienceFinalTime: LocalTime? = null )
这样创建OpeningHours实例时,你可以只传必填的营业时间参数,不便时段会默认是null,比如:
// 无需传不便时段,默认都是null val regularHours = OpeningHours(LocalTime.of(9,0), LocalTime.of(18,0)) // 针对需要设置不便时段的日期,再传入对应值 val holidayHours = OpeningHours(LocalTime.of(9,0), LocalTime.of(14,0), LocalTime.of(11,0), LocalTime.of(12,0))
2. 修复空安全问题,调整业务逻辑处理null情况
你的现有代码里用了!!强制解包可空值,这会导致null时直接崩溃,必须替换成安全的空处理逻辑。我们需要明确:当不便时段的任意一个时间为null时,意味着没有不便时段,所以判断逻辑应该跳过不便时段的检查。
修改containsInconvenience函数
这个函数的语义应该是:判断当前时间是否不在不便时段内(这样配合营业时段判断,就能得出“该时间是否可营业”)。修改后的代码如下:
private fun containsInconvenience(time: LocalTime): Boolean { // 如果任意一个不便时间为null,说明没有不便时段,直接返回true(即不在不便时段) val inconvenienceStart = inconvenienceStartTime ?: return true val inconvenienceEnd = inconvenienceFinalTime ?: return true return if (inconvenienceEnd.isAfter(inconvenienceStart)) { // 跨天的不便时段(比如22:00到02:00):时间在22:00之后 或者 02:00之前,属于不便时段 → 返回false !(time.isAfter(inconvenienceStart) || time.isBefore(inconvenienceEnd)) } else { // 正常时段的不便(比如12:00到14:00):时间在两者之间属于不便时段 → 返回false !(time.isAfter(inconvenienceStart) && time.isBefore(inconvenienceEnd)) } }
修改contains函数
调整营业时段的判断逻辑,确保和不便时段的判断正确结合:
fun contains(time: LocalTime): Boolean { // 先判断是否在营业时段内 val isInBusinessHours = if (startServiceHours.isAfter(finalServiceHours)) { // 跨天营业(比如20:00到06:00):时间在20:00之后 或者 06:00之前 time.isAfter(startServiceHours) || time.isBefore(finalServiceHours) } else { // 正常营业(比如09:00到18:00):时间在两者之间 time.isAfter(startServiceHours) && time.isBefore(finalServiceHours) } // 只有在营业时段内,且不在不便时段内,才返回true return isInBusinessHours && containsInconvenience(time) }
3. 函数参数传递可选LocalTime的通用处理
如果在其他函数里需要接收可选的LocalTime参数,同样可以用可空类型+默认null的方式,然后在函数内部安全处理:
fun checkTimeStatus(targetTime: LocalTime? = null) { val timeToCheck = targetTime ?: // 如果需要动态获取默认时间(比如当前时间),可以在这里处理 LocalTime.now() // 后续逻辑... }
如果不需要动态默认值,直接判断null即可:
fun checkTimeStatus(targetTime: LocalTime? = null) { if (targetTime == null) { // 处理没有传入时间的情况 println("No target time provided") return } // 使用targetTime处理业务逻辑 }
内容的提问来源于stack exchange,提问作者Lamimzera
相关产品推荐
相关产品推荐

