如何初始化静态变量并赋值?Dart是否有类似Java静态初始化块的实现
Dart 静态变量一次性初始化方案
等效于Java静态初始化块的实现
Dart 没有提供和 Java 完全一致的static { }语法格式的静态初始化块,但可以通过以下两种方式实现完全相同的一次性初始化静态变量的效果:
- 复杂逻辑场景用立即执行匿名函数
这种写法和Java静态初始化块的逻辑组织方式最接近,初始化代码只会在静态变量第一次被访问时执行一次:abstract class Dummy { static final Map<String, dynamic> cache = () { final tempMap = <String, dynamic>{}; // 可在此处写任意复杂的初始化逻辑:循环、分支判断、异常捕获等 tempMap['foo'] = Foo(); tempMap['bar'] = Bar(); return tempMap; }(); } - 简单逻辑场景用字面量/级联操作符
如果初始化逻辑简单,可以直接用字面量赋值或者级联操作符简化代码:// 字面量直接赋值 abstract class Dummy { static final Map<String, dynamic> cache = <String, dynamic>{ 'foo': Foo(), 'bar': Bar(), }; } // 级联操作符写法 abstract class Dummy { static final Map<String, dynamic> cache = <String, dynamic>{} ..['foo'] = Foo() ..['bar'] = Bar(); }
对应最佳实践
- 优先选择声明时直接初始化的方式,逻辑简单的场景优先用字面量或级联操作符,代码更简洁易读
- 只有当初始化逻辑复杂(需要循环生成值、分支判断、异常捕获等)时,才使用立即执行匿名函数的写法
- Dart 中的静态变量默认是懒加载的,只会在第一次被访问时执行初始化逻辑,不会在类加载阶段就占用资源,不需要额外处理提前初始化的性能问题
- 如果多个静态变量的初始化逻辑存在强关联,可以抽离单独的私有静态方法统一处理,否则建议每个静态变量独立初始化,降低代码耦合度
内容的提问来源于stack exchange,提问作者sunjinbo
相关产品推荐
相关产品推荐

