You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:07:27