我了解 eager 和 lazy 单子之间的区别: eager 在首次加载时实例化,而 lazy 则在首次使用(方法调用)时实例化。
现在,为了充分理解两者的区别,我们应该知道加载是何时发生的。
根据
本文
,加载发生在
启动 Dart 虚拟机
阶段。就在调用
main
方法的
创建和运行 Dart Isolate
阶段之前。
问题是:当我们从
main
调用单例时
void main() async{
await MyService().execute();
runApp( MainApp());
}
eager
和
lazy
之间几乎没有区别。我说的对吗?
更新。 eager(early) 和 lazy singletons 的实现。
Eager :
class MyService{
MyService._();
static final _instance = MyService._();
factory MyService() => _instance;
}
Laague
Lazy
:
class MyService{
MyService._();
static MyService _instance;
factory MyService() => _instance ??= MyService();
}
</pre
你说得对,在这种情况下,急切单例和惰性单例之间的区别很小。
让我们来分析一下原因:
-
Dart 虚拟机启动和隔离: 你所引用的文章中提到的启动过程确实在
main
函数执行之前发生。这意味着在main
函数的第一行代码运行之前,Dart 虚拟机已经启动,并且隔离已经创建。 -
急切单例: 急切单例在类加载时被实例化。由于 Dart 在执行任何代码之前会加载所有必要的类,因此在调用
main
函数之前,急切单例就已经被创建。 -
惰性单例: 惰性单例在首次被使用时才被实例化。
在你的代码中,你在
main
函数中第一次使用
MyService
时,无论使用哪种单例实现,
MyService
实例都会被创建。
急切单例:
实例在
main
函数执行之前就已经创建好了。
惰性单例:
实例会在
await MyService().execute()
这行代码执行时被创建。
区别:
两者之间的区别在于实例化的时间点相差很小。急切单例的实例化发生在
main
函数之前,而惰性单例的实例化发生在
main
函数的第一行代码执行时。
实际影响: 在这种情况下,这种微小的区别几乎不会对应用程序的性能或行为产生任何实际影响。
结论: 虽然你对急切和惰性单例之间区别的理解是正确的,但在你的代码示例中,这两种方法实际上没有太大区别。选择哪种方法取决于你的个人偏好和项目需求。
标签:flutter,dart,singleton From: 78598408