Dart官方文档中Enum相关规则表述的具体含义是什么
规则含义解释
这段是Dart对Enum类型的强约束,拆成两部分理解即可:
- 你可以正常定义抽象类、mixin,通过
implements或者extends的方式关联内置的Enum类型,在这类抽象类型里给枚举封装统一的公共方法、公共接口,用来给多个枚举类型复用逻辑。 - 但这类实现/继承了
Enum的抽象类型,只有被实际的enum声明通过with混入、implements实现的时候,才能产生真实的实例。任何普通类(不管是抽象还是具体类)只要不是在enum声明里,就算你把Enum接口要求的所有方法(比如index)全手动实现了,也不能创建出实现了该类型的对象,编译器会直接报错。
这条约束的核心目的是保证枚举的封闭性:所有实现了Enum的实例,一定是某个enum里预先定义好的常量,不会有外部代码伪造的枚举值,这样静态分析对枚举的穷尽性检查(比如switch语句提示你是否覆盖所有枚举值)才是完全可靠的。
代码示例
合法用法
// 定义关联Enum的mixin,封装所有枚举通用的逻辑 mixin EnumCode on Enum { String get fullCode => '${runtimeType}_$index'; } // 枚举声明中with这个mixin,是唯一能让EnumCode产生实际实例的场景 enum PayMethod with EnumCode { wechat, alipay, creditCard; } // 定义继承Enum的抽象类,统一枚举的接口规范 abstract class EnumLabel extends Enum { String get label; } // 枚举声明中implements这个抽象类,合法 enum OrderStatus implements EnumLabel { pending(label: '待支付'), paid(label: '已支付'), delivered(label: '已送达'); const OrderStatus({required this.label}); @override final String label; } void main() { // 正常运行,输出 PayMethod_1 print(PayMethod.alipay.fullCode); // 正常运行,输出 待支付 print(OrderStatus.pending.label); }
非法用法(直接编译报错)
// 尝试在普通类中实现上述继承了Enum的类型,编译器直接报错 class FakePayMethod implements EnumCode { // 就算手动实现了Enum要求的index属性,也不允许 @override int get index => 999; @override String get fullCode => 'fake'; } void main() { // 根本到不了运行阶段,编译期就会提示:Enum类型不能被非enum声明的类实现 FakePayMethod(); }
是否属于枚举新特性说明
是,这条规则是Dart 2.17版本推出增强枚举特性时配套的约束。
在2.17版本之前,Dart的枚举能力非常弱:枚举不能混入mixin、不能实现接口、不能自定义成员属性和方法,同时也完全不允许用户自定义的类、mixin关联Enum类型。2.17放开了增强枚举的能力,允许枚举像普通类一样复用逻辑、实现接口,同时加了这条封闭性约束,在放开能力的同时保证枚举类型的安全性不被破坏。
内容的提问来源于stack exchange,提问作者森口万太郎
相关产品推荐
相关产品推荐

