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

如何在后端DTO中存储用户选择的「过期日期/永不过期」选项?

优化CertificateAssignmentDto布尔字段的替代方案

针对你遇到的否定式布尔字段命名尴尬、反转逻辑不优雅的问题,这里提供几种更合理的替代方案:

方案一:使用密封类表达有效期状态

用Kotlin的密封类直接封装两种有效期场景,完全消除布尔字段的歧义,语义最清晰:

// 定义密封类表示两种有效期类型
sealed class Expiry {
    // 有过期日期的情况
    data class ExpiresOn(val date: LocalDate) : Expiry()
    // 永不过期的情况
    object NeverExpires : Expiry()
}

// 更新后的DTO
data class CertificateAssignmentDto(
    val uuid: UUID?,
    val certificate: CertificateDto,
    val employeeId: UUID?,
    val issueDate: LocalDate,
    val expiry: Expiry // 替换原来的两个字段
)

处理逻辑时,用when语句分支判断,代码可读性极强,不会出现布尔值反转的混乱:

when (dto.expiry) {
    is Expiry.ExpiresOn -> handleExpiring(dto.expiry.date)
    Expiry.NeverExpires -> handleNeverExpiring()
}

方案二:用null表示永不过期

去掉冗余的布尔字段,直接利用expirationDate的null值来代表“无过期日期”,符合Kotlin中null表示缺失值的设计习惯:

data class CertificateAssignmentDto(
    val uuid: UUID?,
    val certificate: CertificateDto,
    val employeeId: UUID?,
    val issueDate: LocalDate,
    val expirationDate: LocalDate? // null = 永不过期
)

前端交互上,用户勾选“无过期日期”时,清空日期选择器并禁用,提交时传null;选择具体日期则传对应LocalDate值。只需在DTO的注释或文档中明确说明expirationDate为null的含义即可,字段数量更少,逻辑更简洁。

方案三:使用枚举类定义有效期状态

用枚举替代布尔字段,语义明确且避免否定式命名:

enum class ExpiryStatus {
    EXPIRES, // 有过期日期
    NEVER_EXPIRES // 无过期日期
}

data class CertificateAssignmentDto(
    val uuid: UUID?,
    val certificate: CertificateDto,
    val employeeId: UUID?,
    val issueDate: LocalDate,
    val expirationDate: LocalDate?,
    val expiryStatus: ExpiryStatus
)

注意需要添加校验逻辑,确保expiryStatus与expirationDate的一致性:比如expiryStatus为NEVER_EXPIRES时,expirationDate必须为null;expiryStatus为EXPIRES时,expirationDate不能为空。

内容的提问来源于stack exchange,提问作者ATW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:50:01