Цель «enum type» - создать предопределенный набор значений. Если вы позволите клиентам создавать новые экземпляры 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."
};