Dart中是否可以通过工具命名构造器切换不同预设逻辑的命名构造器?
实现方案说明
你原来的写法不生效是因为Dart不允许在普通构造器的方法体内对this整体赋值,实例在进入构造器方法体时已经完成了内存分配,无法替换为其他实例。可以通过以下两种主流方案实现你的需求:
方案1:工厂构造器(最符合你的需求)
Dart的factory构造器支持直接返回已构造完成的实例,不需要在初始化阶段完成所有字段赋值,完美适配你想封装分支逻辑调用预设命名构造器的场景。
修改后的代码如下:
enum AnimalsEnum { dog, cat } class Animal { final int age; final String data; final AnimalsEnum specie; // 普通默认构造器 Animal(this.age, this.data, this.specie); // 工厂构造器实现分支调度 factory Animal.bySpecie(int age, AnimalsEnum specie) { switch (specie) { case AnimalsEnum.dog: return Animal._dog(age); case AnimalsEnum.cat: return Animal._cat(age); } } // 预设私有命名构造器 Animal._dog(this.age) : specie = AnimalsEnum.dog, data = 'Dogs love Flutter'; Animal._cat(this.age) : specie = AnimalsEnum.cat, data = 'Cats love pasta'; }
外部调用方式非常简洁:final myPet = Animal.bySpecie(3, AnimalsEnum.dog);
所有switch逻辑完全封装在类内部,不需要在Widget层写判断代码。
方案2:初始化列表switch表达式(Dart 3.0+支持)
如果你不想用工厂构造器,也可以在初始化列表中直接用switch表达式给字段赋值,适合预设规则简单的场景:
Animal.bySpecie(this.age, this.specie) : data = switch(specie) { AnimalsEnum.dog => 'Dogs love Flutter', AnimalsEnum.cat => 'Cats love pasta' };
这种方案不需要写额外的私有命名构造器,但是如果每个物种的预设字段很多,代码可读性会比工厂构造器差。
扩展优化建议
如果后续不同物种需要有独立的方法实现,可以把Animal定义为抽象类,每个物种做独立的子类实现,工厂构造器直接返回对应子类的实例,扩展性更强,完全符合OOP的开闭原则。
内容的提问来源于stack exchange,提问作者Bugzilla
相关产品推荐
相关产品推荐

