如何使用Dart构建枚举?

如何使用Dart构建枚举?,dart,Dart,Dart语言没有枚举(尚未??)。至少在语言功能出现之前,构造枚举的正确或惯用方法是什么?Dart现在支持枚举 此答案的其余部分适用于Dart 1.8,请使用Dart对枚举的正式支持(在另一个答案中解释) 没错,Dart语言(还没有?)没有枚举。这是一个很好的例子。 同时,这里有一个惯用的Dart片段来创建您自己的枚举 类枚举{ 最终值; 常量枚举。\u内部(此值); toString()=>“枚举$\u值”; 静态常量FOO=常量枚举。_internal('FOO'); 静态常数条=常数枚举

Dart语言没有枚举(尚未??)。至少在语言功能出现之前,构造枚举的正确或惯用方法是什么?

Dart现在支持枚举

此答案的其余部分适用于Dart 1.8,请使用Dart对枚举的正式支持(在另一个答案中解释)

没错,Dart语言(还没有?)没有枚举。这是一个很好的例子。 同时,这里有一个惯用的Dart片段来创建您自己的枚举

类枚举{
最终值;
常量枚举。\u内部(此值);
toString()=>“枚举$\u值”;
静态常量FOO=常量枚举。_internal('FOO');
静态常数条=常数枚举。_内部('BAR');
静态常量BAZ=常量枚举。_internal('BAZ');
}
使用常量构造函数意味着您可以在交换机中使用此枚举。下面是一个例子:

类水果{
最终值;
常量水果内部(该值);
toString()=>“枚举$\u值”;
静态常数苹果=常数水果;
静态常量梨=常量水果。_内部(“梨”);
静态常量香蕉=常量水果。_内部(“香蕉”);
}
void main(){
var yummy=水果、香蕉;
开关(美味){
case.APPLE:
打印(“一天一个苹果”);
打破
case.PEAR:
印刷品(“蔷薇科梨属”);
打破
案例:香蕉:
打印(“从底部打开,更容易”);
打破
}
}

我在中使用了稍微简单一点的Enum类版本:

/**
*Java枚举类的仿真。
*
*例如:
*
*类计数扩展枚举{
*
*常数表(int-val):超级(val);
*
*静态常数表高=常数表(100);
*静态常数表中间=常数表(50);
*静态常数表低=常数表(10);
* }
*
*使用方法:
*
*断言(米高,100);
*断言(米。高是米);
*/
抽象类枚举{
最终T_值;
常量枚举(此值);
T获取值=>\u值;
}

我喜欢枚举的顶级常量。您可以使用导入来修复任何冲突。这使得使用枚举的详细性大大降低

i、 e

if(m==high){
而不是:

if(m==米高){
枚举定义:

类计量器扩展枚举{
常数表(int-val):超级(val);
}
恒流表高=恒流表(100);
常数表中间=常数表(50);
常数表低=常数表(10);

使用r41815 Dart获得了本机枚举支持,请参见,可以像

enum状态{
没有一个
跑步
停止,
停顿
}
void main(){
打印(状态值);
forEach((v)=>print('value:$v,index:${v.index}');
打印($running:${Status.running},${Status.running.index});
打印('运行索引:${Status.values[1]}');
}
[Status.none、Status.running、Status.stopped、Status.paused]
值:Status.none,索引:0
值:Status.running,索引:1
值:Status.stopped,索引:2
值:Status.paused,索引:3
正在运行:Status.running,1
运行索引:Status.running

限制是不可能为枚举项设置自定义值,它们会自动编号


更多详情请参见本草稿

我喜欢枚举的顶级常量。您可以使用导入来修复任何冲突。这使得使用枚举的详细性大大降低。编辑-添加了一个示例。是否可以添加一个方法:toString()=>value?小警告:创建没有任何值的const对象是常见错误。例如“类枚举{const Enum();}”。这是行不通的,因为Dart规范化常量对象。因此,始终确保有一个区分各个枚举值的值。yummy=='BANANA'返回false。。。真遗憾…:/Dart现在对Enum有实验支持:@anthonybobbenrieth-yes。但是,如果为_value添加一个getter,那么您可以使用yummy.value=='BANANA'。是否可以添加一个
fromString(String)
构造函数?我尝试添加一个
常量factory.fromString(strings)=\u internal但它似乎创建的实例不等于
APPLE
PEAR
BANANA
…从Dart 1.8开始,您现在可以使用正式的枚举。请参阅下面接受的答案。