面试题答案
一键面试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 -> "订单已取消"
}
}
为了适应后续新增订单状态(如退款中),可以按照以下方式以最小改动实现:
- 在密封类
OrderStatus
中新增一个对象表示退款中状态:
sealed class OrderStatus {
object PendingPayment : OrderStatus()
object Paid : OrderStatus()
object Shipped : OrderStatus()
object Received : OrderStatus()
object Cancelled : OrderStatus()
object Refunding : OrderStatus() // 新增退款中状态
}
- 在
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
表达式中添加对应的分支,就能很好地适应扩展,代码的可维护性和扩展性都比较好。