我正在查看Dart SDK 的变更日志,并在Dart SDK v2.14的发行说明中注意到了这一点:
我找不到任何关于此的文档!我可以在哪里使用这个?我试图实现它,但它没有用!
Enum
所有声明类型的超级接口的用例enum
,导致接口被添加,主要是请求对枚举进行抽象的能力。
最常见的请求之一是从枚举中提取名称。例子:
enum FooBar {
foo, bar;
}
人们会要求一种"foo"
从 value中获取字符串的方法FooBar.foo
。该名称在 中可用toString
,它返回字符串"FooBar.foo"
,但不能以其他方式访问。
常见的方法是做
String enumName(dynamic value) {
var string = enumValue.toString();
return string.substring(string.indexOf('.') + 1);
}
您不能将 限制value
为仅枚举值,因为无法识别类型系统中的枚举值。现在可以写成
String enumName(Enum value) { ... }
相反,或作为扩展:
extension EnumName on Enum {
String get name => ....;
}
(扩展的优点是它不会阻止您拥有一个带有name
成员的枚举,例如enum PostalReceiver { name, address, zip, country; }
,实例成员会这样做)。
另一个例子是 Java 的副本EnumSet
:
class EnumSet<T extends Enum> {
int _bits = 0;
final List<T> _values;
EnumSet(List<T> values) : _values = values {
if (values.length > 32) throw UnsupportedError("Too big");
}
void add(T value) {
_bits |= 1 << value.index;
}
void remove(T value) {
_bits &= ~(1 << value.index);
}
bool contains(T value) => _bits & (1 << value.index) != 0;
}
这现在可以很好地键入,仅限于枚举,并且.index
操作是静态类型的以返回一个int
. 如果没有Enum
接口,就无法仅限于枚举,也无法访问,.index
除非动态调用。
枚举仍然受到限制,除了创建一个enum
.