Dart 2.14 中 Enum 接口的用例是什么

Bir*_*ani 3 dart

我正在查看Dart SDK 的变更日志,并在Dart SDK v2.14的发行说明中注意到这一点:

在此输入图像描述

我找不到任何关于此的文档!我可以在哪里使用这个?我尝试实施它,但没有成功!

lrn*_*lrn 6

Enum所有声明类型的超级接口的用例(enum导致添加接口)主要是对枚举进行抽象的能力的请求。

最常见的请求之一是从枚举中提取名称。例子:

enum FooBar {
 foo, bar;
}
Run Code Online (Sandbox Code Playgroud)

人们会寻求一种"foo"从 value 中获取字符串的方法FooBar.foo。该名称在返回字符串 的中可用,但无法以其他方式访问。toString"FooBar.foo"

常见的方法是

String enumName(dynamic value) {
  var string = enumValue.toString();
  return string.substring(string.indexOf('.') + 1);
}
Run Code Online (Sandbox Code Playgroud)

您不能将其限制value为仅枚举值,因为无法识别类型系统中的枚举值。现在可以写成

String enumName(Enum value) { ... }
Run Code Online (Sandbox Code Playgroud)

相反,或作为扩展:

extension EnumName on Enum {
  String get name => ....;
}
Run Code Online (Sandbox Code Playgroud)

(该扩展的优点是它不会阻止您使用成员进行枚举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;
}
Run Code Online (Sandbox Code Playgroud)

现在可以很好地类型化,仅限于枚举,并且该.index操作是静态类型化的以返回int. 如果没有Enum接口,就无法仅限于枚举,并且.index除了动态调用之外无法进行访问。

枚举仍然受到限制,除了创建enum.