0

我想有EnumClass一个可选message字段,如下所示:

class Status extends EnumClass {
  static const Status error = _$error;
  static const Status completed = _$completed;

  String message;

  const Status._(String name) : super(name);

  static BuiltSet<Status> get values => _$values;
  static Status valueOf(String name) => _$valueOf(name);
}

问题是我收到此错误消息:

无法为具有非最终字段的类定义 const 构造函数。

如果我声明messagefinal,那么我不能初始化它,因为构造函数是隐藏的。

有没有办法做到这一点?也许制作一个生成的枚举生成器?

4

1 回答 1

2

“枚举类型”的目的是创建一组预定义的值。如果您允许客户端创建 Status 的新实例,甚至是 const 实例,那么该属性将不再存在;如果传递了这样的实例,该valueOf()方法将抛出异常,并且values不会包含它。所以这违反了“枚举类型”的合同。

  // BAD: no longer an "enum type" if clients can create new instances
  const Status.withMessage(String name, String message)
    : message = message, super(name);

另一方面,如果消息是每个枚举值的常量并且不打算由客户端提供,则可以简单地向类添加一个 getter:

  // GOOD: Adding new methods, getters, or const-initialized member variables is fine.
  String get message =>
      _messages[this] ??
          (throw StateError('No message for Status.$name'));

  static const _messages = const {
    error: "An error occurred.",
    completed: "Successfully completed."
  };
于 2019-03-13T16:04:50.160 回答