�训练 - kotlin: 枚举, 密封类
发布于 17 May 2022
密封类 sealed classes, 不是枚举`mot clef:enum`。
来自 Java,您可能会想要重载您的功能提供枚举: // Java code
enum PizzaOrderStatus {
ORDER_RECEIVED,
PIZZA_BEING_MADE,
OUT_FOR_DELIVERY,
COMPLETED;
public PizzaOrderStatus nextStatus() {
switch (this) {
case ORDER_RECEIVED: return PIZZA_BEING_MADE;
case PIZZA_BEING_MADE: return OUT_FOR_DELIVERY;
case OUT_FOR_DELIVERY: return COMPLETED;
case COMPLETED:return COMPLETED;
}
}
}
与此相反,您可以使用 sealed 类:
sealed class PizzaOrderStatus(protected val orderId: Int) {
abstract fun nextStatus() : PizzaOrderStatus
class OrderReceived(orderId: Int) : PizzaOrderStatus(orderId) {
override fun nextStatus(): PizzaOrderStatus {
return PizzaBeingMade(orderId)
}
}
class PizzaBeingMade(orderId: Int) : PizzaOrderStatus(orderId) {
override fun nextStatus(): PizzaOrderStatus {
return OutForDelivery(orderId)
}
}
class OutForDelivery(orderId: Int) : PizzaOrderStatus(orderId) {
override fun nextStatus(): PizzaOrderStatus {
return Completed(orderId)
}
}
class Completed(orderId: Int) : PizzaOrderStatus(orderId) {
override fun nextStatus(): PizzaOrderStatus {
return this
}
}
}
这种方法的优势是我们现在可以传输数据的 状态:
var status: PizzaOrderStatus = OrderReceived(123)
while (status !is Completed) {
status = when (status) {
is OrderReceived -> status.nextStatus()
is PizzaBeingMade -> status.nextStatus()
is OutForDelivery -> status.nextStatus()
is Completed -> status
}
}
一般来说,如果你想要拥有与一个…关联的数据,sealed classes 是好的 状态。
相关文章
HyperFrames-Gradle: 将 AsciiDoc 转换为 MP4 视频
31 May 2026
31 May 2026
L'Architecture « 插件独立+消费者根 » : 为什么我的Gradle构建会重复?
14 May 2026
14 May 2026
知识图谱作为推荐引擎:我是如何杀死按时间顺序的「相关文章」的
12 May 2026
12 May 2026