MST

星途 面试题库

面试题:Kotlin密封类与when表达式在复杂业务场景中的应用

在一个电商应用中,订单状态使用密封类表示,包括待支付、已支付、已发货、已收货、已取消等状态。要求使用when表达式实现一个函数,根据不同的订单状态返回相应的提示信息,并且要处理好代码的可扩展性,若后续新增订单状态(如退款中),如何以最小的改动适应。请提供完整的Kotlin代码实现。
43.4万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
sealed class OrderStatus {
    object PendingPayment : OrderStatus()
    object Paid : OrderStatus()
    object Shipped : OrderStatus()
    object Received : OrderStatus()
    object Cancelled : OrderStatus()
}

fun getOrderStatusMessage(status: OrderStatus): String {
    return when (status) {
        is OrderStatus.PendingPayment -> "订单待支付"
        is OrderStatus.Paid -> "订单已支付"
        is OrderStatus.Shipped -> "订单已发货"
        is OrderStatus.Received -> "订单已收货"
        is OrderStatus.Cancelled -> "订单已取消"
    }
}

为了适应后续新增订单状态(如退款中),可以按照以下方式以最小改动实现:

  1. 在密封类 OrderStatus 中新增一个对象表示退款中状态:
sealed class OrderStatus {
    object PendingPayment : OrderStatus()
    object Paid : OrderStatus()
    object Shipped : OrderStatus()
    object Received : OrderStatus()
    object Cancelled : OrderStatus()
    object Refunding : OrderStatus() // 新增退款中状态
}
  1. getOrderStatusMessage 函数的 when 表达式中新增一个分支:
fun getOrderStatusMessage(status: OrderStatus): String {
    return when (status) {
        is OrderStatus.PendingPayment -> "订单待支付"
        is OrderStatus.Paid -> "订单已支付"
        is OrderStatus.Shipped -> "订单已发货"
        is OrderStatus.Received -> "订单已收货"
        is OrderStatus.Cancelled -> "订单已取消"
        is OrderStatus.Refunding -> "订单退款中" // 新增分支
    }
}

这样,通过密封类和 when 表达式的特性,在新增订单状态时,只需要在密封类中添加新对象,并在 when 表达式中添加对应的分支,就能很好地适应扩展,代码的可维护性和扩展性都比较好。