Как определить поля во встроенном_значении EnumClass?
Я хотел иметь 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 для класса с неокончательными полями.
И если я объявлю message
как final
, то я не могу его инициализировать, так как конструктор скрыт.
Есть ли способ добиться этого? Может быть, сделать сгенерированный Enum Builder?
1 ответ
Назначение типа enum состоит в создании предопределенного набора значений. Если вы позволите клиентам создавать новые экземпляры Status, даже постоянные, это свойство больше не будет храниться; valueOf()
метод выдаст исключение, если передаст такой экземпляр, и values
не будет содержать это. Так что это нарушает контракт типа enum.
// BAD: no longer an "enum type" if clients can create new instances
const Status.withMessage(String name, String message)
: message = message, super(name);
С другой стороны, если сообщение является постоянным для каждого значения перечисления и не предназначено для предоставления клиентами, вы можете просто добавить геттер в класс:
// 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."
};