Dart 枚举
简单枚举
enum Color { red, green, blue }
增强枚举
增强枚举(Enhanced Enums)是Dart语言在2.15版本中引入的一项新特性。这个特性扩展了枚举(Enum)的能力,使其不仅能表示一组命名常量,而且还能包含方法、属性和构造函数。
额外要求:
- 实例变量必须是最终变量,包括由混合变量添加的变量。
- 所有生成构造函数都必须是常量。
- 工厂构造函数只能返回一个固定的已知枚举实例。
- 由于 Enum 是自动扩展的,因此不能扩展其他类。
- 不能重载索引、哈希代码和相等运算符 ==。
- 不能在枚举中声明名为 values 的成员,因为它会与自动生成的静态值获取器冲突。
- 必须在声明的开头声明枚举的所有实例,而且必须至少声明一个实例。
在增强枚举中,你可以:
- 为每个枚举值定义关联的属性和方法。
- 创建构造函数来初始化这些属性。
- 使用工厂构造函数来控制枚举实例的创建。
- 实现接口,并应用混入(Mixins)
示例1:带属性的枚举
要使用增强枚举Season,你可以根据需要访问其属性和枚举值。以下是一些使用方式的例子:
enum Season {
spring('Spring', 1),
summer('Summer', 2),
autumn('Autumn', 3),
winter('Winter', 4);
final String name;
final int order;
const Season(this.name, this.order);
}
# 使用方式
void main() {
// 访问枚举值
var currentSeason = Season.summer;
// 打印枚举值的属性
print('Season: ${currentSeason.name}, Order: ${currentSeason.order}');
// 使用枚举值进行条件判断
if (currentSeason == Season.winter) {
print('It\'s cold outside!');
}
// 遍历枚举值
for (var season in Season.values) {
print('Season Name: ${season.name}');
}
}
示例2:枚举中的方法
要使用增强枚举Operation,你可以根据需要调用其apply方法来执行数学运算。
enum Operation {
add,
subtract,
multiply,
divide;
double apply(double x, double y) {
switch (this) {
case Operation.add:
return x + y;
case Operation.subtract:
return x - y;
case Operation.multiply:
return x * y;
case Operation.divide:
return x / y;
}
}
}
# 使用方式
void main() {
// 使用枚举执行加法
var resultAdd = Operation.add.apply(10, 5);
print('Addition: $resultAdd');
// 使用枚举执行减法
var resultSubtract = Operation.subtract.apply(10, 5);
print('Subtraction: $resultSubtract');
// 使用枚举执行乘法
var resultMultiply = Operation.multiply.apply(10, 5);
print('Multiplication: $resultMultiply');
// 使用枚举执行除法
var resultDivide = Operation.divide.apply(10, 5);
print('Division: $resultDivide');
}
示例3:枚举和工厂构造函数
在示例3中,我们定义了一个带有工厂构造函数的StatusCode枚举。这个枚举可以根据状态码创建相应的枚举值。
enum StatusCode {
success(200),
notFound(404),
serverError(500);
final int code;
const StatusCode(this.code);
factory StatusCode.fromCode(int code) {
return StatusCode.values.firstWhere((e) => e.code == code, orElse: () => StatusCode.serverError);
}
// 自定义函数
String statusCodeToString = (String statusCode) => 'Status Code $statusCode: $value';
}
// 以下是如何使用这个枚举的示例:
void main() {
// 通过状态码创建枚举值
var code200 = StatusCode.fromCode(200);
print('Status Code 200: ${code200.toString()}'); // Status Code 200: 200
var code404 = StatusCode.fromCode(404);
print('Status Code 404: ${code404.toString()}'); // Status Code 404: 404
// 使用默认情况(例如,对于未知的状态码)
var unknownCode = StatusCode.fromCode(999);
print('Unknown Status Code: ${unknownCode.toString()}'); // Unknown Status Code: 500
}
// 自定义函数
var codeToString = StatusCode.statusCodeToString(200) // Status Code 200: 200